順序表動態實現
阿新 • • 發佈:2021-07-05
1、定義一個結構體
#include <stdio.h> #include <string.h> #include <stdlib.h> #define INITSIZE 10 // 順序表的初始長度。 #define EXTSIZE 5 // 每次擴充套件元素的個數。 typedef int ElemType; // 自定義順序表的資料元素為整數。 typedef struct { ElemType *data; // 儲存順序表中元素的首地址。 unsigned int maxsize; // 順序表元素的最大長度。 unsigned int length; // 順序表中元素的個數。 }SeqList,*PSeqList; int main() { return 0; }
2、建立一個順序表
int main()
{
SeqList LL; // 建立順序表
return 0;
}
3、建立一個數據元素
int main()
{
SeqList LL; // 建立順序表
ElemType ee; // 建立一個數據元素。
return 0;
}
4、建立一個數據元素
void InitList(PSeqList LL); void ClearList(PSeqList LL); int main() { SeqList LL; // 建立順序表 ElemType ee; // 建立一個數據元素。 InitList(&LL); // 初始化順序表。 return 0; } void InitList(PSeqList LL) { LL->data=(ElemType *)malloc(sizeof(ElemType)*INITSIZE); LL->maxsize=INITSIZE; ClearList(LL); // 清空順序表。 } // 清空順序表。 void ClearList(PSeqList LL) { if (LL == NULL) return; // 檢查空指標。 LL->length=0; memset(LL->data,0,sizeof(ElemType)*LL->maxsize); }
5、在表中插入元素
int InsertList(PSeqList LL, unsigned int ii, ElemType *ee); int ExtList(PSeqList LL); int main() { SeqList LL; // 建立順序表 ElemType ee; // 建立一個數據元素。 InitList(&LL); // 初始化順序表。 printf("在表中插入元素(1、2、3、4、5、6、7、8、9、10)。\n"); ee=1; InsertList(&LL, 1, &ee); ee=2; InsertList(&LL, 1, &ee); ee=3; InsertList(&LL, 1, &ee); ee=4; InsertList(&LL, 1, &ee); ee=5; InsertList(&LL, 1, &ee); ee=6; InsertList(&LL, 1, &ee); ee=7; InsertList(&LL, 1, &ee); ee=8; InsertList(&LL, 1, &ee); ee=9; InsertList(&LL, 1, &ee); ee=10; InsertList(&LL, 1, &ee); return 0; } // 擴充套件順序表的記憶體空間,返回值:0-失敗;1-成功。 int ExtList(PSeqList LL) { // 分配新的記憶體空間。 ElemType *newdata=(ElemType *)malloc(sizeof(ElemType)*(LL->maxsize+EXTSIZE)); // 如果分配失敗,返回0。 if (newdata == NULL) return 0; memset(newdata,0,sizeof(ElemType)*(LL->maxsize+EXTSIZE)); // 把順序表中原來的內容複製到新分配的記憶體空間中。 memcpy(newdata,LL->data,sizeof(ElemType)*LL->maxsize); // 釋放原來的記憶體空間。 free(LL->data); // 把順序表資料元素的指標指向新分配的記憶體空間的地址。 LL->data=newdata; // 重置順序表的maxsize變數。 LL->maxsize=LL->maxsize+EXTSIZE; return 1; } // 在順序表LL的第ii個位置插入元素ee,返回值:0-失敗;1-成功。 int InsertList(PSeqList LL, unsigned int ii, ElemType *ee) { if ( (LL == NULL) || (ee == NULL) ) return 0; // 檢查空指標。 if (LL->length >= LL->maxsize) { if (ExtList(LL) == 0) { printf("護展順序表失敗。\n"); return 0; } } // 判斷插入位置是否合法 if ( (ii < 1) || (ii > LL->length+1) ) { printf("插入位置(%d)不合法,應該在(%d-%d)之間。\n",ii,1,LL->length+1); return 0; } // 注意,元素後移只能用迴圈,不能用以下注釋掉的方法,當元素是結構體時,以下方法不穩定。 // if ( ii < LL->length+1) // memcpy(LL->data+ii,LL->data+ii-1,(LL->length-ii+1)*sizeof(ElemType)); // 把ii和ii之後的元素後移。 int kk; for (kk=LL->length;kk>=ii;kk--) { memcpy(LL->data+kk,LL->data+kk-1,sizeof(ElemType)); // 採用memcpy是為了支援ee為結構體的情況。 // memcpy(&LL->data[kk],&LL->data[kk-1],sizeof(ElemType)); // 也可以採用陣列的形式。 } memcpy(LL->data+ii-1,ee,sizeof(ElemType)); // 採用memcpy是為了支援ee為結構體的情況。 LL->length++; // 表的長度加1。 return 1; }