C语言—单链表

单链表操作:读取,插入和删除

  1 #include "stdafx.h"
  2 #include <string.h>
  3 #include <stdio.h>
  4 #include <stdlib.h>
  5 
  6 struct Node
  7 {
  8     int val;
  9     struct Node *next;
 10 };
 11 
 12 // build No head node
 13 struct Node * build_N_LinkList(int a[], int len)
 14 {
 15     struct Node * phead = NULL;  //struct Node * phead, last;
 16     struct Node * last = NULL;
 17     int k;
 18     for (k = 0; k <=len-1; k++)
 19     {
 20         struct Node * pnewnode = (struct Node *)malloc(sizeof(struct Node));
 21         pnewnode->val = a[k];
 22         pnewnode->next = NULL;
 23         if (k == 0)
 24         {
 25             phead = pnewnode;
 26             /*last->next = pnewnode;*/
 27             last = pnewnode;
 28         }
 29         else
 30     {
 31         last->next = pnewnode;
 32         last = pnewnode;
 33         }
 34     }
 35     return phead;
 36 }
 37 
 38 //build Head node
 39 struct Node *build_H_LinkList(int a[], int len )
 40 {
 41     struct Node * headnode = (struct Node *)malloc(sizeof(struct Node));
 42     int k;
 43     struct Node * phead = NULL;
 44     struct Node * plast = NULL;
 45     for (k = 0; k <= len - 1; k++)
 46     {
 47         struct Node * newnode = (struct Node *)malloc(sizeof(struct Node));
 48         newnode->val = a[k];
 49         newnode->next = NULL;
 50         if (k == 0)
 51         {
 52             headnode->next = newnode;
 53             phead = headnode;
 54             plast = newnode;
 55         }
 56         else
 57         {
 58             plast->next = newnode;
 59             plast = newnode;
 60         }
 61     }
 62     return phead;
 63 }
 64 
 65 // read with no head node
 66 int GetElem(struct Node *phead, int i)
 67 {
 68     int k = i;
 69     struct Node * p;
 70     p = phead;
 71     if (NULL==p) //这就是为什么很多时候常量(NULL)写在前面的原因,一旦写成“=”,编绎器就会报错,就可以直接看出来 ,你以后会经常看到这种写法
 72         return -1;   
 73     while (k != 1)
 74     {
 75         p = p -> next;
 76         --k;
 77     }
 78     return p->val;
 79 }
 80 
 81 //insert element before  ith. (no head node)//放在最后一个算插入么???
 82 int ListInsert_N (struct Node *phead, int a, int  i, int len)
 83 {
 84     int k =1,m;
 85     struct Node *p = phead;
 86     struct Node *pr = phead;
 87     struct Node *newnode = (struct Node*)malloc(sizeof (struct Node));
 88     newnode->val = a;
 89     newnode->next = NULL;
 90     if (i <= 0 || i > len + 1) //either first or last
 91         return -1;
 92        else if (i==1)  //first
 93        {
 94            newnode->next = p;
 95            pr = newnode;
 96        }
 97         else  //1 < i <= len+1,  middle&last
 98         {
 99                      
100             while (k<i-1)
101             {
102                 p = p-> next;
103                ++k;
104             }
105             newnode ->next = p->next;
106             p->next = newnode;
107         }
108        len = len + 1;  
109        for (m = 1; m <= len; m++)
110        {
111            printf("%d\n", pr->val);
112            pr = pr->next;
113        }
114     return 0;
115 }
116 
117 //insert element before  ith. (with head node)
118 int ListInsert_H(struct Node *phead, int a, int i, int len)
119 {
120     struct Node * p = phead;
121     struct Node * pr = phead;
122     struct Node *newnode = (struct Node *)malloc(sizeof(struct Node));
123     newnode->val = a;
124     newnode->next = NULL;
125     int k = 1;
126     int m;
127     if (i <= 0 || i > len + 1)//
128         return -1;
129     else 
130     {
131         
132         while (k  < i)//i==len+1 : add in last.
133         {
134             p = p ->next;
135             ++k;
136         }
137         //此时p指向啥?第i个节点?k==i,退出循环,p指向i?
138         newnode->next = p->next;
139         p->next = newnode;
140     }
141         
142     len = len + 1;
143     for (m = 1; m <= len; m++) 
144     {    
145         pr = pr->next;
146         printf("%d\n", pr->val);
147     }
148     return 0;
149 }
150 
151 // delete element before ith (No head node)
152 int ListDelete_N(struct Node *phead, int i, int len)
153 {
154     int k;
155     int m;
156     struct Node *p = phead;
157     struct Node *q = NULL;
158     struct Node *pr = phead;
159     if (i <= 0 || i > len)
160         return -1;
161     else if (i == 1)
162     {
163         q = p;
164         pr = p->next;
165         free(q);
166     }
167     else
168     {
169         k = i-1;
170         while (k != 1)
171         {
172             p = p->next;
173             --k;
174         }
175         q = p->next;
176         p->next = q->next;
177         free(q);
178     }
179     len = len - 1;
180     for (m = 1; m <= len; m++)
181     {
182         printf("%d\n", pr->val);
183         pr = pr->next;
184     }
185     return 0;
186 }
187 
188 //delete element before ith (Head node)
189 int ListDelete_H(struct Node * phead, int i, int len)
190 {
191     struct Node *p = phead;
192     struct Node *pr = phead;
193     struct Node *q = NULL;
194     int k,m ;
195     if (i <= 0 || i > len)
196         return -1;
197     else
198     {
199         k = i - 1;
200         while ( k != 0)
201         {
202             p = p->next;
203             --k;
204         }
205         q = p->next;
206         p->next = q->next;
207         free(q);
208     }
209     len = len - 1;
210     for (m = 1; m <= len; m++)
211     {
212         pr = pr->next;
213         printf("%d\n", pr->val);
214     }
215 
216 }
217 
218 int main()
219 {
220     int a[] = { 1,2,3,4,5 };
221     int len,tmp;
222     struct Node * phead;
223 
224     len = sizeof(a) / sizeof(a[0]);   //注意:是sizeof(a),不是sizeof(a[])。
225     phead = build_H_LinkList(a, len);  //注意:是a,不是a[]。
226     //phead = build_N_LinkList(a, len);  //注意:是a,不是a[]。
227     //ListInsert_H(phead,8,2,len);    
228     //ListInsert_N(phead, 8, 6, len);
229     //ListDelete_N(phead, 5,len);
230     ListDelete_H(phead, 1, len);
231     //tmp = GetElem(phead, 3);
232     //printf("%d\n", tmp);
233 }

 

posted @ 2019-03-21 14:22  刘海儿啊  阅读(206)  评论(0编辑  收藏  举报