[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(&currentNode);
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(&currentNode);
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(&currentNode);
124 
125     // 销毁链表
126     destroyLinkList(&mainList);
127 
128     exit(0);
129 }

对于指针的使用 还是头很大哈...

posted on 2012-08-11 01:31  bluefrog  阅读(3518)  评论(1编辑  收藏  举报