單鏈表的創建及增刪改查功能的實現


  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<math.h>
  4 
  5 typedef int DataType;
  6 typedef struct node{          //結點類型定義
  7     DataType data;           //結點的數據域
  8     struct node *next;      //結點的指針域
  9 }ListNode,*LinkList;
 10 ListNode *p;
 11 LinkList head;
 12 /*注意:定義結點結構時,有幾點需要注意:
 13         LinkList和ListNode *是不同名字的同一個指針類型,
 14         LinkList類型的指針變量head表示他是單鏈表的頭指針,
 15         ListNode *類型的指針變量p表示它是指向某一結點的指針*/
 16 LinkList InitList()
 17 {
 18     LinkList L;
 19     L=(ListNode*)malloc(sizeof(ListNode));
 20     if(L==NULL)
 21     {
 22         printf("分配空間失敗!");
 23         exit(1);
 24     }
 25     L->next=NULL;
 26     return L;
 27 }
 28 
 29 /*頭插法建立單鏈表*/
 30 LinkList CreatListF()
 31 {
 32     DataType x;
 33     LinkList L;
 34     ListNode *s;
 35     L=(ListNode *)malloc(sizeof(ListNode));      //頭結點
 36     if(L==NULL)                                 //檢查L是否分配到儲存空間
 37     {
 38         printf("分配空間失敗!");
 39         exit(1); 
 40     }
 41     L->next=NULL;
 42     scanf("%d",&x);
 43     while(x!=0)
 44     {
 45         s=(ListNode *)malloc(sizeof(ListNode));     //為新插入的結點申請空間
 46         if(s==NULL)
 47         {
 48             printf("分配空間失敗!");
 49             exit(1);
 50         }
 51         s->data=x;
 52         s->next=L->next;
 53         L->next=s;
 54         scanf("%d",&x);
 55     }
 56     return L;
 57 }
 58 
 59 
 60 /*尾插法建立單鏈表*/
 61 LinkList CreatListL()
 62 {
 63     DataType x;
 64     LinkList L=(ListNode *)malloc(sizeof(ListNode));         //頭結點
 65     if(L==NULL)
 66     {
 67         printf("分配空間失敗!");
 68         exit(1);
 69     }
 70     ListNode *s,*r;
 71     r=L;
 72     scanf("%d",&x);
 73     while(x!=0)           //以0輸入表示結束
 74     {
 75         s=(ListNode *)malloc(sizeof(ListNode));          //為新插入的結點申請空間
 76         if(s==NULL)
 77         {
 78             printf("分配空間失敗!");
 79             exit(1);
 80         }
 81         s->data=x;
 82         r->next=s;
 83         r=s;
 84         scanf("%d",&x);
 85     }
 86     r->next=NULL;             //單鏈表的最后一個指針為空
 87     return L;
 88 }
 89 
 90 //獲取鏈表長度 
 91 int GetLength(LinkList L)
 92 {
 93     int num=0;
 94     ListNode *p;
 95     p=L->next;
 96     while(p!=NULL)
 97     {
 98         num++;
 99         p=p->next;
100     }
101     return(num);
102 }
103 
104 //查找第i位元素 
105 ListNode *GetNode(LinkList L,int i)
106 {
107     int j=1;
108     ListNode *p;
109     if(i<1||i>GetLength(L))
110     {
111         printf("查找的位置不正確!");
112         exit(1);
113     }
114     p=L->next;
115     while(p!=NULL&&j<i)
116     {
117         p=p->next;
118         j++;
119     }
120     return p;
121 }
122 
123 //查找元素x 
124 int LocateListi(LinkList L,DataType x)
125 {
126     ListNode *p=L->next;
127     int i=1;
128     while(p!=NULL&&p->data!=x)
129     {
130         p=p->next;
131         i++;
132     }
133     if(p==NULL)
134         return 0;
135     else
136         return i;
137 } 
138 
139 //在第i位插入元素x 
140 void InsertList(LinkList L,DataType x,int i)
141 {
142     ListNode *p,*q,*s;
143     int j=1;
144     p=L;
145     if(i<1||i>GetLength(L)+1)
146     {
147         printf("插入位置不正確!");
148         exit(1);
149     }
150     s=(ListNode *)malloc(sizeof(ListNode));
151     if(s==NULL)
152     {
153         printf("分配空間失敗!");
154         exit(1);
155     }
156     s->data=x;
157         while(j<=i)
158         {
159             q=p;
160             p=p->next;
161             j++;
162         }
163         s->next=p;
164         q->next=s;
165 }
166 
167 //刪除第i位元素 
168 void DeleteList(LinkList L,int i)
169 {
170     ListNode *p,*q;
171     int j=1;
172     p=L;
173     if(i<1||i>GetLength(L))
174     {
175         printf("刪除位置不正確!");
176         exit(1);
177     }
178     while(j<i)
179     {
180         p=p->next;
181         j++;
182     }
183     q=p->next;
184     p->next=q->next;
185     free(q);
186 }
187 
188 //打印鏈表 
189 void PrintList(LinkList L)
190 {
191     ListNode *p;
192     p=L->next;
193     printf("鏈表元素如下:\n");
194     while(p!=NULL)
195     {
196         printf("%d ",p->data);
197         p=p->next;
198     }
199     printf("\n");
200 }
201 int main()
202 {
203     DataType a;
204     head=InitList();
205     printf("我們將采用頭插法創建一個單鏈表L!\n請輸入您要輸入的數據(以空格隔開,以0結束!)\n");
206     head=CreatListF();
207     printf("單鏈表的長度為:%d\n",GetLength(head));
208     printf("請輸入您要查找元素的結點序號:");
209     scanf("%d",&a);
210     printf("第%d個元素為:%d\n",a,GetNode(head,a)->data);
211     printf("請輸入您要查找的元素:");
212     scanf("%d",&a);
213     printf("您查找的元素%d在鏈表中的第%d個位置\n",a,LocateListi(head,a));
214     int x,i;
215     printf("請輸入您要插入元素的數值以及位置:");
216     scanf("%d%d",&x,&i);
217     InsertList(head,x,i);
218     PrintList(head);
219     printf("請輸入您想要刪除元素的位置:");
220     scanf("%d",&i);
221     DeleteList(head,i);
222     PrintList(head);
223     return 0;
224 }

 


免責聲明!

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



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