单链表的创建及增删改查功能的实现

  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 }

猜你喜欢

转载自www.cnblogs.com/srx-0816/p/11528840.html