順序表屬於順序存儲結構,是最簡單的順序表,基本思想是用一段連續的儲存單元依次存儲線性表的數據元素,通常使用數組來定義,就能實現增,刪,改,差等基本操做。
使用結構體來實現順序表,結構體中有一個data數組,用來連續存儲數據。變量last用來指明當前順序表中有幾個數據,方便訪問順序表。數組
typedef struct seqlist{ int data[MAX_LIST]; //數據域,MAX_LIST = 10 int last; //下標域 }my_seqlist, *p_my_seqlist;
當須要建立一個順序表時,能夠調用此函數,此函數給順序表分配一個堆空間,而且將地址返回,接收此返回值用p_my_seqlist變量。函數
p_my_seqlist init_list(){ p_my_seqlist p_my_seqlist1 = calloc(1, sizeof(my_seqlist)); if(NULL == p_my_seqlist1) return false; return p_my_seqlist1; }
當須要在順序表中插入數據的時候,調用此函數。注意須要傳入已經初始化好的順序表,第二個形參爲須要插入的數據。測試
int insert_seqlist(p_my_seqlist p_my_seqlist1, int data){ if(NULL == p_my_seqlist1){ printf("LIST指針爲空\n"); return false; } if(MAX_LIST <= p_my_seqlist1->last){ printf("順序表以滿,沒法創建順序表\n"); printf("p_my_seqlist1->last:%d\n",p_my_seqlist1->last); return false; } p_my_seqlist1->data[p_my_seqlist1->last++] = data; //每插入一個數據last須要加1,表示順序表中的數據多了一個 return true; }
將順序表中的數據打印出來。指針
int print_seqlist(p_my_seqlist p_my_seqlist1){ int i; if(NULL == p_my_seqlist1){ printf("LIST指針爲空\n"); return false; } printf("p_my_seqlist1->last:%d\n",p_my_seqlist1->last); TRAVERSR(){ //#define TRAVERSR() for(int i = 0; i < p_my_seqlist1->last; i++) 由於這個循環會反覆用到,因此使用了宏定義 printf("p_my_seqlist->data[%d]:%d\n", i, p_my_seqlist1->data[i]); } printf("p_my_seqlist1->last:%d\n",p_my_seqlist1->last); return true; }
查找順序表中的數據fdata,而且返回這個數據的下標。code
int find_seqlist(p_my_seqlist p_my_seqlist1, int fdata){ if(NULL == p_my_seqlist1){ printf("LIST指針爲空\n"); return false; } printf("在順序表中查找數據:%d\n", fdata); TRAVERSR(){ if(p_my_seqlist1->data[i] == fdata){ printf("在順序表中查找到數據:%d\n", p_my_seqlist1->data[i]); return i; } } printf("順序表中沒有這個數據:%d\n", fdata); return 0; }
能夠調用此函數用來刪除一個數據,參數2是刪除下標del_num的值,能夠配合函數find_seqlist()使用。blog
int del_seqlist(p_my_seqlist p_my_seqlist1, int del_num){ if(NULL == p_my_seqlist1){ printf("LIST指針爲空\n"); return false; } p_my_seqlist1->data[del_num] = p_my_seqlist1->data[del_num+1]; for(;del_num < p_my_seqlist1->last-1;del_num++){ p_my_seqlist1->data[del_num+1] = p_my_seqlist1->data[del_num+2]; } p_my_seqlist1->last--; printf("del_seqlist:p_my_seqlist1->last:%d\n",p_my_seqlist1->last); return true; }
將data[num]的數據修改成mdata,配合find_seqlist()使用,能夠修改一個指定的值。內存
int mdata_seqlist(p_my_seqlist p_my_seqlist1, int num, int mdata){ if(NULL == p_my_seqlist1){ printf("LIST指針爲空\n"); return false; } p_my_seqlist1->data[num] = mdata; printf("數據修改成了:p_my_seqlist1->data[num] = : %d\n", p_my_seqlist1->data[num]); return true; }
將順序表所佔的內存釋放it
int destroy_seqlist(my_seqlist** p_my_seqlist1) //將&p_my_seqlist1傳入 { *p_my_seqlist1 = NULL; free(*p_my_seqlist1); printf("順序表已被銷燬了\n"); return true; }
int test(){ p_my_seqlist p_my_seqlist1; //初始化順序表 p_my_seqlist1 = init_list(); int find_data; if(NULL == p_my_seqlist1) return false; //插入10個數據 insert_seqlist(p_my_seqlist1, 0); insert_seqlist(p_my_seqlist1, 1); insert_seqlist(p_my_seqlist1, 2); insert_seqlist(p_my_seqlist1, 3); insert_seqlist(p_my_seqlist1, 4); insert_seqlist(p_my_seqlist1, 5); insert_seqlist(p_my_seqlist1, 6); insert_seqlist(p_my_seqlist1, 7); insert_seqlist(p_my_seqlist1, 8); insert_seqlist(p_my_seqlist1, 9); //打印數據 print_seqlist(p_my_seqlist1); //查找數據,返回數據的下標 int num = find_seqlist(p_my_seqlist1,9); //刪除數據 del_seqlist(p_my_seqlist1, num); print_seqlist(p_my_seqlist1); //修改數據 num = find_seqlist(p_my_seqlist1,8); mdata_seqlist(p_my_seqlist1,num,100); print_seqlist(p_my_seqlist1); //銷燬表格 destroy_seqlist(&p_my_seqlist1); printf("%p\n", p_my_seqlist1); insert_seqlist(p_my_seqlist1, 49); print_seqlist(p_my_seqlist1); del_seqlist(p_my_seqlist1, 2); return 1; }