標籤:資料結構 c語言 struct malloc
順序表指的是資料元素在記憶體中連續分配地址的數組,由於指標無法指出數組長度,編譯時間不會報錯,所有用結構體來表示一個順序表:
順序表用C語言的表示方法如下:
<span style="font-family: Arial, Helvetica, sans-serif;"> #define OK 1</span>
#define ERROR -1 typedef int elem_type;
typedef int Statue; // int Arrylength; typedef struct sqlist { elem_type *Arry; int Arrylength; } Sqlist; //建立一個空表 Statue Create_Sqlist(Sqlist *&S) { //S->Arry = (elem_type *) malloc(MaxSize*sizeof(elem_type));//L = (sqlist *)malloc(sizeof(sqlist)); // L->data = (char *)malloc(maxsize); S = (Sqlist *)malloc(sizeof(Sqlist)); S->Arry = (elem_type *)malloc(MaxSize); if(!S->Arry) { return ERROR; } else { S->Arrylength = 0; return OK; } }//順序表賦初始值 void Init_Sqlist(Sqlist *&S) { int i; for(i=0;i<20;i++) { S->Arry[i]=rand()%100; S->Arrylength++; } } //在第i個位置添加一個元素m Statue Insert_Sqlist(Sqlist *&S,int i,int InsertNum){ if(i<=0 && i>S->Arrylength) return ERROR; else { int j; for(j=0;j<=S->Arrylength-i;j++) S->Arry[S->Arrylength-j]=S->Arry[S->Arrylength-1-j]; //i以後元素往後移動一位 S->Arry[i-1]=InsertNum; S->Arrylength++; return OK; }}//將第i個元素刪除 Statue Delete_Sqlist(Sqlist *&S,int i){ if(i<=0 && i>S->Arrylength) return ERROR; else { int j; for(j=0;j<=S->Arrylength-i;j++) S->Arry[i-1+j]= S->Arry[i+j]; S->Arrylength--; return OK; }}//刪除值為x的元素 void DeleteX_Sqlist(Sqlist *&S,int x){ int i; for(i=0;i< S->Arrylength;i++) { if(x == S->Arry[i]) { //Delete_Sqlist( *S, i);int j; for(j=0;j<=S->Arrylength-i;j++) S->Arry[i+j]= S->Arry[i+j+1]; S->Arrylength--; } }} //列印函數 void print(Sqlist *&S) { int m;for(m=0;m<S->Arrylength;m++){cout<<setw(4)<<S->Arry[m];if((m+1)%4==0)cout<<endl; } }int main(){Sqlist *p1; Create_Sqlist( p1);cout<<"建立順序表is OK"<<endl; Init_Sqlist(p1);cout<<"初始化順序表is OK,資料如下:"<<endl;print(p1); int i,InsertNum;cout<<"輸入兩個如下:";cin>>i;cin>>InsertNum;cout<<"插入數操作如下:在第"<<i<<"行插入數字"<<InsertNum<<"後。結構顯示如下:"<<endl;Insert_Sqlist( p1, i, InsertNum);print(p1);int k;cout<<endl;cout<<"輸入一個數如下:";cin>>k;cout<<"刪除數操作如下:"<<endl;cout<<"想要刪除第"<<k<<"個數 顯示如下:"<<endl; Delete_Sqlist(p1,k); print(p1);int j;cout<<"輸入一個數"<<endl; cin>>j;cout<<"刪除指定數操作如下:輸入想要刪除的數是:"<<j<<" 結果顯示如下:"<<endl; DeleteX_Sqlist(p1,j);print(p1);while(1);return 0;} 顯示結果如下:
分析比較下面程式碼片段的差別:
A段——建立空表沒有bug的代碼:
typedef struct sqlist { elem_type *Arry; int Arrylength; } Sqlist; //建立一個空表 Statue Create_Sqlist(Sqlist *&S) { S = (Sqlist *)malloc(sizeof(Sqlist)); S->Arry = (elem_type *)malloc(MaxSize); }B段——建立空表出現bug的代碼:
typedef struct sqlist { elem_type Arry[MaxSize]; int Arrylength; } Sqlist; //建立一個空表 Statue Create_Sqlist(Sqlist *S) { S->Arry = (elem_type *) malloc(MaxSize*sizeof(elem_type)); }