鏈表的創建、增加、刪除、改數據、遍歷


這兩天搞了搞鏈表,發現這東西挺好用的,特此記錄一下自己敲下的代碼,希望給后面的人一點啟發 = =

代碼可以直接拷貝測試

下面是鏈表節點,這里用來測試,就沒搞很多字段了

1 typedef struct Student_Node{
2     int id;
3     struct Student_Node *next;
4 }Student_Node;
5 
6 typedef Student_Node *Student;

接下來是節點的創建函數

 1 Student creatStudent(int n)
 2 {
 3     int var;
 4     Student s,p,index;
 5     s = malloc(sizeof(Student));//頭結點
 6     s->id = n;
 7     index = s;
 8     for (var = 1; var <= n; ++var) {
 9         p = malloc(sizeof(Student));
10         p->id = var;
11         index->next = p;
12         index = p;
13     }
14     index->next = NULL;
15     return s;
16 }

添加節點函數,這里用的尾插法,尾插法比較直觀易懂

 1 void addStudent(Student s,int id)
 2 {
 3     Student q,p=s;
 4     while(p->next != NULL)
 5     {
 6         p = p->next;
 7     }
 8     q = malloc(sizeof(Student));
 9     q->id = id;
10     q->next = NULL;
11     p->next = q;
12     s->id++;
13 }

打印節點函數,實際上就是遍歷整個鏈表

 1 void printfStudent(Student s)
 2 {
 3     Student p;
 4     p = s;
 5     while( p->next != NULL)
 6     {
 7         printf("id=%d;\r",p->id);
 8         p = p->next;
 9     }
10     printf("id=%d;\r\r",p->id);
11 }

插入節點函數

 1 void insetStudent(Student s,int n,int id)
 2 {
 3     int i=0;
 4     Student p,index;
 5     p = s;
 6     while( p->next != NULL && i<n)
 7     {
 8         p = p->next;
 9         i++;
10     }
11 
12     index = malloc(sizeof(Student));
13     index->id = id;
14     index->next = p->next;
15     p->next = index;
16     s->id++;
17 }

刪除節點函數

 1 void deleteStudent(Student s,int n)
 2 {
 3     Student q,p = s;
 4     int i = 1;
 5     while(p->next !=NULL && i < n)
 6     {
 7         p = p->next;
 8         i++;
 9     }
10     q = p->next;
11     p->next = q->next;
12     free(q);
13     s->id--;
14 }

改節點函數

 1 void changeStudent(Student s,int n,int id)
 2 {
 3     Student p=s;
 4     int i = 0;
 5     while(p->next != NULL && i < n)
 6     {
 7         p= p->next;
 8         ++i;
 9     }
10     p->id = id;
11 }

最后是主函數了,我這里進行了一一測試,頭節點的id為節點總數

 1 int main(void) {
 2 
 3     Student s;
 4 
 5     s = creatStudent(10);//創建十個節點,不包括頭節點,以下都是不包括頭節點
 6     printfStudent(s);//打印
 7 
 8     insetStudent(s,1,100);//在第1個位置后面插入id為100的節點
 9     printfStudent(s);//打印
10 
11     deleteStudent(s,1);//刪除第一個節點
12     printfStudent(s);//打印
13 
14     addStudent(s,888);//在末尾插入一個id為888的節點
15     printfStudent(s);//打印
16 
17     changeStudent(s,1,1);//感覺第一個數據是100不合適,沒理由 = =!
18     printfStudent(s);//打印
19 
20     return EXIT_SUCCESS;
21 }

下面是測試的結果

 1 id=10;
 2 id=1;
 3 id=2;
 4 id=3;
 5 id=4;
 6 id=5;
 7 id=6;
 8 id=7;
 9 id=8;
10 id=9;
11 id=10;
12 
13 id=11;
14 id=1;
15 id=100;
16 id=2;
17 id=3;
18 id=4;
19 id=5;
20 id=6;
21 id=7;
22 id=8;
23 id=9;
24 id=10;
25 
26 id=10;
27 id=100;
28 id=2;
29 id=3;
30 id=4;
31 id=5;
32 id=6;
33 id=7;
34 id=8;
35 id=9;
36 id=10;
37 
38 id=11;
39 id=100;
40 id=2;
41 id=3;
42 id=4;
43 id=5;
44 id=6;
45 id=7;
46 id=8;
47 id=9;
48 id=10;
49 id=888;
50 
51 id=11;
52 id=1;
53 id=2;
54 id=3;
55 id=4;
56 id=5;
57 id=6;
58 id=7;
59 id=8;
60 id=9;
61 id=10;
62 id=888;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM