現在把以前學的數據結構知識再理一遍,上機測試。首先最重要的是鏈表。在我看來,鏈表其實就是由一個個結構體連接而成的,創建一個鏈表有多種方式,頭插法,尾插法等,這里采用的是尾插法。表述有不對的地方,歡迎更正,一起進步。
思路如下:
1.鏈表的創建
首先,采用尾插法創建一個動態鏈表,並返回改鏈表的頭結點。
第一步,設置一個頭結點head和尾結點tail,剛開始這兩個結點的指針域相同;
第二步,去開辟一個新的結點pnew,並為該結點的數據域賦值;
第三步,讓尾結點指向新結點,tail->pnew,代碼表示即為tail->next=pnew,相當與有一條鏈子把tail和pnew這兩個結點連接起來了;
第四步,既然是尾插法,那么下一個新的結點也是插在尾結點tail的后面啦,經過第三步,可知尾結點變成剛開始的pnew(此時,它才是尾巴!),所以必須將tail變成尾結點,即tail=pnew;
最后最后,一定要讓尾結點指向空地址,方便后面的遍歷。
2.鏈表的遍歷。
有了頭結點(頭結點是我們沒有預先賦值哦,它的下一個結點才是我們要遍歷的第一個結點),我們就可以通過這個頭開始按順序訪問鏈表中的每個結點了,當然,在訪問完到最后一個結點時,就停止遍歷了,那么停止的條件就是當phead指向空時,所有上面我們為什么要讓尾結點指向空。還有一點,phead只是方便遍歷這個鏈表的一個臨時結點,如果直接用鏈表的頭結點head來 遍歷,下一次對鏈表進行操作時(遍歷,插入,刪除等),就很難了,你想想頭都不見了,就很尷尬。
3.鏈表結點的刪除
定義兩個相鄰的指針p1和p2分別指向鏈表head的head->next,根據自己想要刪除結點的位置,這兩個指針進行移動(始終相鄰),最后p2指向的結點即為將要刪除的結點。
4.鏈表結點的添加
先去創造一個新的結點pnew,也定義兩個相鄰的指針p1和p2指向鏈表head和head->next,同理進行移動,然后只需在p1和p2中間插入新節點,很簡單,就是讓p1->next為pnew,pnew->next為p2
5.鏈表結點的修改
相對於前面的刪除、添加,這個操作更簡單。只需定義一個指針p,根據需要修改的地方進行移動,移動到待修改的結點,改變其數據域即可。
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <stdbool.h> 5 int NodeNum = 0; //統計結點個數 6 typedef struct Node 7 { 8 int data; 9 struct Node* next; 10 }NODE,*PNODE; 11 12 //創建一個動態鏈表並返回其頭指針 13 PNODE CreatList() 14 {
printf("輸入數據,以0結束輸入\n"); 15 PNODE head = (PNODE)malloc(sizeof(NODE)); 16 PNODE tail = head; 17 int num = 0; 18 int Flag = 1; 19 scanf("%d", &num); 20 //輸入數據,以0結束 21 while (num) 22 { 23 PNODE pnew = (PNODE)malloc(sizeof(NODE)); 24 pnew->data = num; 25 tail->next = pnew; 26 tail = pnew; 27 NodeNum++; 28 scanf("%d", &num); 29 } 30 31 tail->next = NULL; 32 return head; 33 } 34 //遍歷鏈表 35 void tarverse(PNODE head) 36 { 37 PNODE phead = head->next; 38 while (phead != NULL) 39 { 40 printf("%d ", phead->data); 41 phead = phead->next; 42 } 43 printf("一共有%d個結點\n", NodeNum); 44 } 45 //判斷是否為空鏈表 46 bool isEmpty(PNODE head) 47 { 48 if (head->next = NULL) 49 { 50 printf("鏈表為空\n"); 51 return true; 52 } 53 else 54 return false; 55 } 56 //刪除結點 57 void DelNode(PNODE head) 58 { 59 int location = 0; 60 printf("刪除第幾個結點?"); 61 scanf("%d", &location); 62 PNODE p1 = head; 63 PNODE p2 = p1->next; 64 for (int i = 0; i < location-1; i++) 65 { 66 p1 = p1->next; 67 p2 = p2->next; 68 } 69 p1->next = p2->next; 70 free(p2); 71 p2 = NULL; 72 NodeNum--; 73 } 74 //增加結點 75 int AddNode(PNODE head) 76 { 77 PNODE p1 = head; 78 PNODE p2 = p1->next; 79 int location = 0; 80 int newdata = 0; 81 printf("添加在第幾個位置?"); 82 scanf("%d", &location); 83 printf("輸入新結點數據:"); 84 scanf("%d", &newdata); 85 PNODE pnew = (PNODE)malloc(sizeof(NODE)); 86 pnew->data = newdata; 87 for (int i = 0; i < location - 1; i++) 88 { 89 p1 = p1->next; 90 p2 = p2->next; 91 } 92 p1->next = pnew; 93 pnew->next = p2; 94 NodeNum++; 95 return 0; 96 } 97 //修改結點 98 int AlterNode(PNODE head) 99 { 100 PNODE p = head; 101 int location = 0; 102 int newdata = 0; 103 printf("修改第幾個結點?"); 104 scanf("%d", &location); 105 printf("輸入新結點數據:"); 106 scanf("%d", &newdata); 107 PNODE pnew = (PNODE)malloc(sizeof(NODE)); 108 pnew->data = newdata; 109 for (int i = 0; i < location; i++) 110 { 111 p = p->next; 112 } 113 p->data = newdata; 114 return 0; 115 } 116 int main() 117 { 118 PNODE p= (PNODE)malloc(sizeof(NODE)); 119 p = CreatList(); 120 tarverse(p); 121 DelNode(p); 122 tarverse(p); 123 AddNode(p); 124 tarverse(p); 125 126 system("pause"); 127 return 0; 128 }