#include<stdio.h> #include<stdlib.h> #define LIST_INIT_SIZE 50 //線性表存儲空間的初始分配量 #define LISTINCREMENT 10 //線性表存儲空間的分配增量 typedef int ElemType; //存儲單元類型 typedef struct { ElemType *elem; //存儲空間基址 int length; //當前長度 int listsize; //當前分配的存儲容量(以sizeof(EleType)爲單位) }SqList; /** *建立順序表 */ SqList CreateList_Sq() { SqList* list=(SqList*)malloc(sizeof(SqList)); //建立順序表 return *list; } /** *初始化順序表 *返回1 表示初始化成功 *返回0 表示初始化失敗 */ int InitList_Sq(SqList* L) { L->elem=(ElemType*)malloc(sizeof(ElemType)*LIST_INIT_SIZE); //建立動態數組並把地址賦給順序表基址 if(!L->elem) //存儲分配失敗 return 0; L->length=0; //空表長度位0 L->listsize=LIST_INIT_SIZE; //初始存儲容量 return 1; } /** *在順序線性表L中第i個位置以前插入新的元素e *i的合法值爲1<=i<=ListLength_Sq(L)+1 */ int ListInsert_Sq(SqList* L,int i,ElemType e) { if(i<1||i>L->length+1) //i值不合法 return 0; if(L->length==L->listsize) //當前存儲空間已滿,增長分配 { ElemType* newbase=(ElemType*)realloc(L->elem,sizeof(ElemType)*(L->listsize+LISTINCREMENT)); if(!newbase) //存儲分配失敗 return 0; L->elem=newbase; //新基址 L->listsize+=LISTINCREMENT; //增長容量 } ElemType* q=&(L->elem[i-1]); //q爲插入位置 ElemType* p=0; for(p=&(L->elem[L->length-1]);p>=q;--p) //插入位置及以後的元素右移 *(p+1)=*p; *q=e; //插入e ++L->length; //表長增1 return 1; } int main() { SqList list=CreateList_Sq(); InitList_Sq(&list); int i; for(i=0;i<100;i++) { ListInsert_Sq(&list,i+1,i+1); } for(i=0;i<100;i++) { printf("%d\t",list.elem[i]); if((i+1)%5==0) printf("\n"); } return 0; }
嚴蔚敏老師的教材裏用到引用傳值,純C語言沒法實現,只能用CPP文件去編譯,爲此,特地將引用傳值改成了指針做爲參數。上例實現了建立、初始化、插入的封裝。數組
感覺到了數據結構的魅力。數據結構
參考資料:《數據結構(C語言版)》做者 嚴蔚敏指針