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 }