c语言版单链表

  1 //c语言单链表
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 typedef struct Node
  5 {
  6   int data;//数据域
  7   struct Node *pNext;//指针域
  8 }NODE,*PNODE;////NODE等价于struct Node    PNODE等价于struct Node *
  9 //函数声明
 10 PNODE create_list();//创建链表
 11 void traverse_list(PNODE pHead);//遍历链表
 12 int is_empty(PNODE pHead);//判断链表是否为空
 13 int length_list(PNODE);//求链表长度
 14 int insert_list(PNODE pHead, int pos, int val);//在pHead所指向链表的第pos个节点的前面插入一个新的结点,该节点的值是val, 并且pos的值是从1开始
 15 int delete_list(PNODE pHead, int pos, int *pVal);//删除链表第pos个节点,并将删除的结点的值存入pVal所指向的变量中,  并且pos的值是从1开始
 16 void sort_list(PNODE);//对链表排序
 17 
 18 PNODE create_list()
 19 {
 20   int len;//用来存放有效节点的个数
 21   int i;
 22   int val;//用来临时存放用户输入的节点的值
 23 
 24   //分配一个存放有效数据的头结点
 25   PNODE pHead = (PNODE)malloc(sizeof(NODE));
 26   if (pHead==NULL)
 27   {
 28     printf("内存分配失败,程序终止\n");
 29     exit(-1);
 30   }
 31   PNODE pTail = pHead;
 32   pTail->pNext = NULL;
 33 
 34   printf("请输入要生成的链表的节点个数:len=");
 35   scanf("%d", &len);
 36 
 37   for (i=0;i<len;++i)
 38   {
 39     printf("请输入第%d个节点的值", i + 1);
 40     scanf("%d", &val);
 41 
 42     PNODE pNew = (PNODE)malloc(sizeof(NODE));
 43     if (pNew==NULL)
 44     {
 45       printf("内存分配失败,程序终止\n");
 46       exit(-1);
 47     }
 48     pNew->data = val;
 49     pTail->pNext = pNew;
 50     pNew->pNext = NULL;
 51     pTail = pNew;
 52   }
 53   return pHead;
 54 }
 55 void traverse_list(PNODE pHead)
 56 {
 57   PNODE p = pHead->pNext;
 58   while (p!=NULL)
 59   {
 60     printf("%d  ", p->data);
 61     p = p->pNext;
 62   }
 63   printf("\n");
 64 
 65   return;
 66 }
 67 
 68 int is_empty(PNODE pHead)
 69 {
 70   if (pHead->pNext==NULL)
 71   {
 72     return 1;
 73   }
 74   else
 75   {
 76     return 0;
 77   }
 78 }
 79 int length_list(PNODE pHead)
 80 {
 81   PNODE p = pHead->pNext;
 82   int len = 0;
 83   while (p!=NULL)
 84   {
 85     ++len;
 86     p = p->pNext;
 87   }
 88   return len;
 89 }
 90 void sort_list(PNODE pHead)
 91 {
 92   int i, j, t;
 93   int len = length_list(pHead);
 94   PNODE p, q;
 95   for (i=0,p=pHead->pNext;i<len-1;++i,p=p->pNext)
 96   {
 97     for (j=i+1,q=p->pNext;j<len;++j,q=q->pNext)
 98     {
 99       if (p->data>q->data)//类似a[i]>a[j]
100       {
101         t = p->data;
102         p->data = q->data;
103         q->data = t;
104       }
105     }
106   }
107   return;
108 }
109 
110 int insert_list(PNODE pHead, int pos, int val)
111 {
112   int i = 0;
113   PNODE p = pHead;
114 
115   while (p!=NULL&&i<pos-1)
116   {
117     p = p->pNext;
118     ++i;
119   }
120   if (i>pos-1||p==NULL)
121   {
122     return 0;
123   }
124   //如果程序能执行到这一行说明p已经指向了第pos-1个结点,但第pos-1个节点是否存在无所谓
125    //分配新的结点
126   PNODE pNew = (PNODE)malloc(sizeof(NODE));
127   if (NULL == pNew)
128   {
129     printf("动态分配内存失败!\n");
130     exit(-1);
131   }
132   pNew->data = val;
133   //将新的节点存入p节点的后面
134   PNODE q = p->pNext;
135   p->pNext = pNew;
136   pNew->pNext = q;
137 
138   return 1;
139 }
140 
141 int delete_list(PNODE pHead, int pos, int *pVal)
142 {
143   int i = 0;
144   PNODE p = pHead;
145 
146   while (p->pNext!=NULL&&i<pos-1)
147   {
148     p = p->pNext;
149     ++i;
150   }
151   if (i>pos-1||p->pNext==NULL)
152   {
153     return 0;
154   }
155   //如果程序能执行到这一行说明p已经指向了第pos-1个结点,并且第pos个节点是存在的
156 
157   PNODE q = p->pNext;//q指向待删除的节点
158   *pVal = q->data;
159 
160   //删除p节点后面的节点
161   p->pNext = p->pNext->pNext;
162 
163   //释放q所指向的节点所占的内存
164   free(q);
165   q = NULL;
166 
167   return 1;
168 }
169 int main()
170 {
171   PNODE pHead = NULL;
172   int val,len;
173   pHead = create_list();//create_list()功能:创建一个非循环单链表,并将该链表的头结点的地址付给pHead
174   printf("链表是否为空:\n");
175   if (is_empty(pHead))
176     printf("链表为空!\n");
177   else
178     printf("链表不空!\n");
179 
180   traverse_list(pHead);
181   printf("插入操作在第3个位置插入2\n");
182   insert_list(pHead, 3, 2);
183   traverse_list(pHead);
184   printf("插入操作在第4个位置删除\n");
185   if (delete_list(pHead, 4, &val))
186   {
187     printf("删除成功,您删除的元素是: %d\n", val);
188   }
189   else
190   {
191     printf("删除失败!您删除的元素不存在!\n");
192   }
193   traverse_list(pHead);
194   printf("求长度操作\n");
195    len = length_list(pHead);
196   printf("链表的长度是%d\n", len);
197   printf("排序操作\n");
198   sort_list(pHead);
199   traverse_list(pHead);
200   return 0;
201 }

 

posted @ 2020-11-21 00:33  丁帅帅dss  阅读(135)  评论(0)    收藏  举报