if(str==NULL) {
m_data = new char[1]; // 若能加 NULL 判断则更好 *m_data = ?\\0?;
} else {
int length = strlen(str);
m_data = new char[length+1]; // 若能加 NULL 判断则更好 strcpy(m_data, str); } }
// 拷贝构造函数
String::String(const String &other) // 3分 {
int length = strlen(other.m_data);
m_data = new char[length+1]; // 若能加 NULL 判断则更好 strcpy(m_data, other.m_data); }
// 赋值函数
String & String::operate =(const String &other) // 13分 {
// (1) 检查自赋值 // 4分 if(this == &other) return *this;
// (2) 释放原有的内存资源 // 3分 delete [] m_data;
// (3)分配新的内存资源,并复制内容 // 3分 int length = strlen(other.m_data);
m_data = new char[length+1]; // 若能加 NULL 判断则更好 strcpy(m_data, other.m_data);
// (4)返回本对象的引用 // 3分 return *this; }
2. 不调用C++/C的字符串库函数,请编写函数strcmp的实现(10)。
int strcmp ( const char * src, const char * dst )
char *strcpy(char *strDest, const char *strSrc) {
char *address = strDest; while (*strDest++ = * strSrc++) NULL ;
return address ; }
3.F(n)=F(n-1)+F(n-2),F(0)=1,F(1)=1.分别用递归和循环求F(5)(10)。
public int R(int num){ if(num<=0){ num=1;
}else if(num==1){ num=1; }else{
num=R(num-1)+R(num-2); }
return num; }
public int c(int num) { int a = 1; int b = 1; int c = 0;
for (int i = 0; i < num- 2; i++) { c = a + b; a = b; b = c; }
return c; }
4. 写一算法,对单链表实现就地逆置(不要构造新结点)(10)。
node *reserve(node*head) {
node*p1,*p2,*p3;
if((head==NULL)||(head->next==NULL)) return head;
p1=head; p2=p1->next; while(p2!=NULL)
{
p3=p2->next; p2->next=p1; p1=p2; p2=p3; }
head->next=NULL; p1=head; return head; }
5.从冒泡排序、直接插入排序、二分插入排序和选择排序四种排序算法中,选择其中一种算法,写出它的实现?(10)
#include
void BubbleSort(int *L,int N) { //冒泡 int i,j; int t;
for(i=1;i<=N;i++) {
for(j=N;j>i;j--) if(L[j] t=L[j]; L[j]=L[j-1]; L[j-1]=t; } } } int SelectMinKey(int *L,int N,int n) { int i,min=n; for(i=n+1;i<=N;i++) if(L[i] return min; } void SelectSort(int *L,int N) { //选择 int i,j; int t; for(i=1;i j=SelectMinKey(L,N,i); if(i!=j) { t=L[i]; L[i]=L[j]; L[j]=t; } } } void InsertSort(int *L,int N) { //插入 int i,j; for(i=2;i<=N;i++) { if(L[i] L[0]=L[i]; L[i]=L[i-1]; for(j=i-2;L[0] void ShellInsert(int *L,int N, int dk) { // 对顺序表L作一趟希尔插入排序。本算法对算法10.1作了以下修改: // 1. 前后记录位置的增量是dk,而不是1; // 2. r[0]只是暂存单元,不是哨兵。当j<=0时,插入位置已找到。 int i,j; for(i=dk+1;i<=N;++i) if(L[i] { // 需将L.r[i]插入有序增量子表 L[0]=L[i]; // 暂存在L.r[0] for(j=i-dk;(j>0&&L[0] L[j+dk]=L[j]; // 记录后移,查找插入位置 L[j+dk]=L[0]; // 插入 } } // ShellInsert void ShellSt(int *L,int N, int dlta[], int t) { // 算法10.5 // 按增量序列dlta[0..t-1]对顺序表L作希尔排序。 for(int k=0;k ShellInsert(L,N, dlta[k]); // 一趟增量为dlta[k]的插入排序 } // ShellSort void ShellSort(int *L,int N) { //希尔 int t=(int)log(N); int k,*dlta; dlta=(int*)malloc(t*4); //产生增量序列 for(k=0;k dlta[k]=(int)pow(2,t-k)-1; ShellSt(L,N,dlta,t); } int main() { int N=250; int i,j,k; int t; int ti[16]; int *L; srand(time(NULL)); printf(\长度\\t|冒泡\\t|选择\\t|插入\\t|希尔\\n\ printf(\---------\ for(j=0;N<100000;j++) {