鏈表學習
阿新 • • 發佈:2017-08-03
一個 char scan srand 深入 刪除數據 遍歷 class 想法
最近看了一小部分《大話數據結構》對鏈表的部分有了更深刻的認識,這本書真的挺不錯,很能吸引讀者,不會枯燥。鏈表部分,之前有過學習,但並沒有深入,當時還感覺鏈表也就那麽回事,做題時有個插入節點的,當時想法是對的,但細節有問題,因而一直沒能做成功。
進行插入操作時,我當時想法是這樣的(偽代碼):
- /* 假設已經創建了一個鏈表 LinkList */
- int linkListInsert(int i)
- {
- int j;
- LinkList *s;
- p=head; /*全局變量*/
- j=1;
- while(p && j<i) /*遍歷鏈表*/
- {
- p = p -> next;
- j++;
- }
- if(!p || j>i)
- return 0;
- s = (LinkList *) malloc (sizeof (LinkList) );
- enter >> (s -> LinkElem); /* (偽代碼) 向該節點數據域輸入數據 */
- p -> next = s;
- s -> next = p -> next; /* 正好犯了書中指出的錯誤 */
- /* 這裏上一個鏈表節點指向的後一個節點被賦予了新地址,並存放了數據。下一步,s -> next = p -> next; 的作用是將上一個節點的後面接上新節點(因為原本 p 是指向 p ->next的 即 p = p -> next),但因為 p -> next = s; 所以 s -> next = s; 也就是說將會出現 p = s;而沒有了後繼元素。*/
- return 1;
- }
- p -> next = s;
- s -> next = p -> next;
這部分是差不多的,但是是錯誤的。
其他的刪除節點、獲取某節點上的元素什麽的都比較簡單,也就不用細究了。
最後附上自己學習這部分後完整實現創建鏈表、插入節點、刪除節點、獲取某節點元素的代碼(因為書上好像沒有完整的代碼,只有部分功能片段代碼)
代碼如下:
#include <stdio.h> #include <time.h> #include <conio.h> #include <stdlib.h> #defineINITIA 5 typedef int ElemType; typedef int Status; typedef struct Node { ElemType data; struct Node * next; }node; node * head = NULL, *p, *q; Status GetElem(); Status LinkListInsert(); Status LinkListDelete(); //獲取某個地址的元素 Status GetElem(int i, ElemType e) { int j; p = head; j = 1; while(p && j < i) { p = p -> next; ++j; } if(!p || j > i) return 0; e = p -> data; printf("%d",p -> data); return 1; } //向鏈表某位置插入節點 Status LinkListInsert(int i) { int j; node * s; p = head; j = 1; while(p && j < i) { p = p ->next; ++j; } if(!p || j > i) return 0; s = ( node * ) malloc ( sizeof ( node ) ); s -> data = rand()%100 + 1; s ->next = p -> next, p -> next = s ; return 1; } //刪除鏈表某節點 Status LinkListDelete(int i, ElemType e) { int j; node * s; p = head; j = 1; while(p && j < i - 1) //這裏書中是 j < i,這樣寫會有什麽變化,感興趣的可以自己改一下試試 { p = p -> next; ++j; } if(!p || j > i) return 0; s = p -> next; p -> next = p -> next -> next; e = s -> data; free(s); return 1; } int main() { char str; int i; ElemType e = 0; srand ( time( 0 ) ); for(i = 0; i < INITIA; i ++) { p = ( node * ) malloc ( sizeof ( node ) ); if(head == NULL) head = p; else q ->next = p; p -> next = NULL; p -> data = rand()%100 + 1; q = p; } p = head; while(p) { printf("%d ",p -> data); p = p -> next; } printf("\n查找 請按 1 插入數據 請按 2 刪除數據 請按 3"); str = getch(); if(str == ‘1‘) { printf("\n請輸入要查找的數的位置:"); scanf("要查找的數為:%d\n",&i); GetElem(i, e); } if(str == ‘2‘) { printf("\n請輸入要插入的數的位置:"); //插在原本該位置上數據的後一位
scanf("%d",&i); LinkListInsert(i); p = head; while(p) { printf("%d ",p -> data); p = p -> next; } } if(str == ‘3‘) { printf("\n請輸入要刪除的數的位置:"); scanf("%d",&i); LinkListDelete(i, e); p = head; while(p) { printf("%d ",p -> data); p = p -> next; } } return 0; }
鏈表學習