標籤:標記 表示 next *** node 合法性 ber number pre
這兩天在複習C語言的知識,為了給下個階段學習OC做準備,以下的代碼的編譯運行環境是Xcode5.0版本,寫篇博文把昨天複習的C語言有關鏈表的知識給大家分享一下,以下是小菜自己總結的內容,代碼也是按照自己的思路所編寫的,有不足之處還請大牛們批評指教。
確切的說鏈表屬於資料結構中線性表中的內容,在鏈表中儲存的內容是按線性排列的,就像是一條線把所要存的資料串起來,可以把鏈表類比成一串珠子,資料就是一個個的珠子,資料間的next指標就相當於穿珠子的線。
鏈表操作的時間複雜度: 往鏈表中插入資料的時間複雜度為O(1)。
想真正的理解鏈表及在C語言中的表示方法的前提是理解C語言中的指標和結構體,閑話少說,進代碼才是關鍵,代碼中基本上都有注釋
1.用結構體定義鏈表的節點
1 //定義鏈表中的節點2 typedef struct node{3 //儲存資料4 int data;5 //指向下一個節點6 struct node *next;7 }Node;
2.定義鏈表的整體結構,存放鏈表的節點和鏈表中的資訊
//定義鏈表結構typedef struct { //存放前端節點 Node *head; //記錄節點的個數 int count;}List;
3.鏈表的初始化,給鏈表分配頭結點,節點個數初始化為0
/************************************************ *功能:初始化鏈表,分配頭結點,結點個數為0 *參數:鏈表指標 *Mr.li *日期:14-07-23 ************************************************/void initLinkList(List *list){ //給前端節點分配記憶體 list->head = malloc(sizeof(Node)); //頭結點的下一個節點為空白 list->head->next = NULL; //總節點個數為0 list->count = 0;}
4.建立單項鏈表,這裡為了簡單起見,把要存入資料先存入到array中,下面我是用逆序的方法來建立鏈表的,是從head節點後插入資料,也可以用順序建鏈表,從鏈表的後面插入資料
/************************************************ *功能:逆序建立鏈表,從頭結點後插入 *參數:鏈表指標 *Mr.li *日期:14-07-23 ************************************************/void createLinkList(List *list){ //建立鏈表用到的資料 int a[10] = {1,2,3,4,5,6,7,8,9,10}; //臨時節點指標用於分配節點記憶體 Node *p; for (int i = 0; i < 10; i++) { //給新的節點分配記憶體 p = (Node *)malloc(sizeof(Node)); //給新節點賦值 p->data = a[i]; //把值加入到前端節點後面,逆序建立鏈表 p->next = list->head->next; list->head->next = p; //鏈表節點個數加一 list->count++; }}
5.為了方便查看鏈表中的值,需要一個列印鏈表中的資料的函數
/************************************************ *功能:列印鏈表中的值 *參數:鏈表指標 *Mr.li *日期:14-07-23 ************************************************/void printList(List *list){ //臨時節點指標變數 Node *p; //從頭開始遍曆 p = list->head->next; while (p != NULL) { //自訂的輸出整的函數 print(p->data); p = p->next; } putchar(‘\n‘);}
6.查詢元素在鏈表中對於的位置
/************************************************ *功能:尋找鏈表中指定值的位置,有的返還其位置,無,返還-1 *參數:鏈表指標,要尋找的值 *Mr.li *日期:14-07-23 ************************************************/int search(List *list, int obj){ //定義遊標指標 Node *p; //標記值的位置 int local = 0; p = list->head->next; while (p != NULL) { local ++; if (p->data == obj) { //傳回值的位置 return local; } p = p->next; } //值不存在返回-1 return -1;}
7.刪除鏈表中的相應的資料
/************************************************ *功能:刪除鏈表中的值 *參數:鏈表指標,要刪除的值 *Mr.li *日期:14-07-23 ************************************************/void delete(List *list, int obj){ //查詢要刪除的元素是否在鏈表中,有返還相應的位置,沒有則返還-1 int flag = search(list, obj); //判斷值的合法性 if (flag == -1) { printf("沒有要刪除的值!\n"); } else { //定義兩個輔助遊標指標 Node *p, *q; //給q,p賦值 q= list->head; p = list->head->next; //迴圈尋找相應的值並刪除 while (p != NULL) { if (p->data == obj) { q->next = p->next; p->next = NULL; free(p); break; } q = p; p = p->next; } }}
8.往鏈表中插入資料
/************************************************ *功能:往指定的位置後插入相應的值 *參數:鏈表指標,插入的位置,插入的值 *Mr.li *日期:14-07-23 ************************************************/void insert(List *list, int local, int number){ int count = 0; //判斷值的合法性 if(count > list->count) { printf("你輸入的值不合法\n"); } else { //定義遊標指標,指向鏈表的頭結點 Node *p = list->head; while (count != local) { p++; count++; } //分配新的結點並給新的結點賦值 Node *q = (Node *) malloc(sizeof(Node)); q->data = number; q->next = NULL; //插入新的結點 q->next = p->next; p->next = q; } }
C語言之鏈表