1. 程式人生 > >鏈表學習

鏈表學習

一個 char scan srand 深入 刪除數據 遍歷 class 想法

  最近看了一小部分《大話數據結構》對鏈表的部分有了更深刻的認識,這本書真的挺不錯,很能吸引讀者,不會枯燥。鏈表部分,之前有過學習,但並沒有深入,當時還感覺鏈表也就那麽回事,做題時有個插入節點的,當時想法是對的,但細節有問題,因而一直沒能做成功。

  進行插入操作時,我當時想法是這樣的(偽代碼):

  1. /* 假設已經創建了一個鏈表 LinkList */
  2. int linkListInsert(int i)
  3. {
  4.   int j;
  5.   LinkList *s;
  6.   p=head;    /*全局變量*/
  7.   j=1;
  8.   while(p && j<i)  /*遍歷鏈表*/
  9.   {
  10.     p = p -> next;
  11.     j++;
  12.   }
  13.   if(!p || j>i)
  14.     return 0;
  15.   s = (LinkList *) malloc (sizeof (LinkList) );
  16.   enter >> (s -> LinkElem);  /* (偽代碼) 向該節點數據域輸入數據 */
  17.   p -> next = s;
  18.   s -> next = p -> next;  /* 正好犯了書中指出的錯誤 */
  19.   /* 這裏上一個鏈表節點指向的後一個節點被賦予了新地址,並存放了數據。下一步,s -> next = p -> next; 的作用是將上一個節點的後面接上新節點(因為原本 p 是指向 p ->next的 即 p = p -> next),但因為 p -> next = s; 所以 s -> next = s; 也就是說將會出現 p = s;而沒有了後繼元素。*/
  20.   return 1;
  21. }

  1. p -> next = s;
  2. s -> next = p -> next;

這部分是差不多的,但是是錯誤的。

其他的刪除節點、獲取某節點上的元素什麽的都比較簡單,也就不用細究了。

最後附上自己學習這部分後完整實現創建鏈表、插入節點、刪除節點、獲取某節點元素的代碼(因為書上好像沒有完整的代碼,只有部分功能片段代碼)

代碼如下:

#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
#define
INITIA 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; }

鏈表學習