資料結構2-動態生成順序表的例項與分析
阿新 • • 發佈:2019-01-25
動態建立一個順序表,並完成插入和刪除的操作。程式碼如下:
#include"stdio.h" #include"conio.h" #define MaxSize 10 typedef int ElemType;/*將int定義為ElemType*/ typedef struct{ int *elem; int length; int listsize; }Sqlist; /** 初始化一個順序表 */ /** 引數L:Sqlist型別的指標 */ void initSqlist(Sqlist *L){ L->elem=(int *)malloc(MaxSize*sizeof(ElemType)); if(!L->elem) exit(0); L->length=0; L->listsize=MaxSize; } /** 向順序表中插入元素 */ /** 引數L:Sqlist型別的指標 */ /** 引數i:插入元素的位置 */ /** 引數item:插入的元素 */ void InsertElem(Sqlist *L,int i,ElemType item){ /* 向順序表L中第i個位置上插入元素item */ ElemType *base,* insertPtr,*p; if(i<1 || i>L->length+1) exit(0); if(L->length>=L->listsize){ base=(ElemType *)realloc(L->elem,(L->listsize+10)*sizeof(ElemType)); L->elem=base; L->listsize=L->listsize+100; } insertPtr=&(L->elem[i-1]); for(p=&(L->elem[L->length-1]);p>=insertPtr;p--) *(p+1)=*p; *insertPtr=item; L->length++; } /** 向順序表中刪除元素 */ /** 引數L:Sqlist型別的指標 */ /** 引數i:刪除元素的位置 */ void DelElem(Sqlist *L,int i){ /* 從順序表L中刪除第i個元素 */ ElemType *delItem,*q; if(i<1 || i>=L->length+1) exit(0); delItem=&(L->elem[i-1]); q=L->elem+L->length-1; for(++delItem;delItem<=q;++delItem) *(delItem-1)=*delItem; L->length--; } /* 測試函式 */ main(){ Sqlist l; int i; initSqlist(&l); for(i=0;i<15;i++) InsertElem(&l,i+1,i+1); printf("\nThe content of the list is\n"); for(i=0;i<l.length;i++) printf("%d ",l.elem[i]); DelElem(&l,5); printf("\nDelete the fifth element\n"); for(i=0;i<l.length;i++) printf("%d ",l.elem[i]); system("pause"); exit(0); }
例項的分析與說明:
1.本程式雖然是動態生成,但是本質上還是一個順序表,也就是它在本質上是一個數組,所以陣列的特性它都有,可以隨機訪問。
2.q=L->elem+L->length-1;語句的解釋:q指向的是順序表的最後一個元素,由於q是一個指標而不是一個元素,所以它指向的是地址,那麼就需要基地址+順序表長度,就是最後一個元素的地址了。