[c/c++] C数据结构: 链表 Linked List
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 }
对于指针的使用 还是头很大哈...
think in coding