1 #include "stdio.h"
2 #include "stdlib.h"
3
4 typedef int ElemType;
5
6 typedef struct node {
7 ElemType data;
8 struct node *next;
9 } *LNode, *LinkList;
10
11 // 初始化一个链表
12 LinkList
13 initLinkList(int n) {
14 LinkList list = NULL;
15 ElemType e;
16 LNode p,r;
17
18 int i;
19 for(i = 1; i <= n; i++) {
20 scanf("%d",&e);
21 p = (LinkList) malloc(sizeof(LNode));
22 p->data = e;
23 p->next = NULL;
24 if(!list) list = p;
25 else r->next = p;
26 r = p; // 下一个节点
27 }
28
29 return list; // 返回链表头指针
30 }
31
32 // 打印链表
33 void
34 printLinkList(LinkList *L) {
35 while(*L) {
36 printf("%d ",(*L)->data);
37 (*L) = (*L)->next;
38 }
39 printf("\n");
40 }
41
42 // 向链表插入结点
43 void
44 insertLinkListNode(LinkList *list,LNode insertNode,ElemType item) {
45 LinkList newNode;
46 newNode = (LNode) malloc(sizeof(LNode));
47 newNode->data = item;
48 if(!*list) {
49 *list = newNode;
50 newNode->next = NULL;
51 } else {
52 // 从1个位置开始向后插入?
53 newNode->next = insertNode->next; // 插入点
54 insertNode->next = newNode;
55 // 插入到开始位置 测试一下 有段错误 可能问题在main
56 //*list = newNode;
57 //newNode->next = insertNode;
58 }
59 }
60
61 // 删除链表的指定结点
62 void deleteLinkListNode(LinkList *list,LNode deleteNode) {
63 LNode currentNode;
64 if(deleteNode == *list) { // 第一个节点
65 *list = deleteNode->next;
66 free(deleteNode);
67 } else {
68 for(currentNode = *list; currentNode->next != deleteNode; currentNode = currentNode->next);
69 if(currentNode->next != NULL) { // ?
70 currentNode->next = deleteNode->next;
71 free(deleteNode);
72 }
73 }
74 }
75
76 // 销毁一个链表
77 void destroyLinkList(LinkList *list) {
78 LNode currentNode,nextNode;
79 currentNode = *list;
80 while(currentNode) {
81 nextNode = currentNode->next;
82 free(currentNode);
83 currentNode = nextNode;
84 }
85 *list = NULL;
86 }
87
88 int
89 main() {
90 int i;
91 ElemType item;
92 LinkList mainList;
93 LNode currentNode;
94
95 // 初始化链表 initLinkList(0) 可以生成一个空的链表
96 mainList = initLinkList(2);
97 currentNode = mainList;
98 printf("the current linklist:\n");
99 printLinkList(¤tNode);
100
101 currentNode = mainList;
102 // 向链表中插入很多数据 0停止
103 scanf("%d",&item);
104 while(item) {
105 insertLinkListNode(&mainList,currentNode,item);
106 currentNode = currentNode->next;
107 scanf("%d",&item);
108 }
109 currentNode = mainList;
110
111 printf("After insert the current linklist:\n");
112 printLinkList(¤tNode);
113
114 // 删除
115 currentNode = mainList;
116 printf("delete the third item\n");
117 for(i = 0;i < 2; i++) {
118 currentNode = currentNode->next;
119 }
120 printf("%d\n",currentNode->data);
121 deleteLinkListNode(&mainList,currentNode);
122 currentNode = mainList;
123 printLinkList(¤tNode);
124
125 // 销毁链表
126 destroyLinkList(&mainList);
127
128 exit(0);
129 }
对于指针的使用 还是头很大哈...
原文链接: https://www.cnblogs.com/bluefrog/archive/2012/08/11/2633248.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/58912
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!