单链表的创建,插入,删除等操作——精简版

不多说废话,直接上代码。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 //定义节点类型,不带头结点:
  5 typedef struct Node
  6 {
  7     int data;
  8     struct Node *next;
  9 }LNode;
 10 
 11 /**    创建链表,
 12  *    从终端接收数据,使用尾部插入法完成。
 13  *    成功返回1,失败返回0
 14  **/
 15 int creatList(LNode *h)
 16 {
 17     LNode *t,*p;
 18     char ch;
 19     t = h;
 20     p = NULL;
 21 
 22     while((ch = getchar()) != '\n'){
 23         p = (LNode *)malloc(sizeof(LNode));
 24         if(p == NULL)
 25             return 0;
 26         p->data = ch;
 27         p->next = NULL;
 28         t->next = p;
 29         t = p;
 30     }
 31 
 32     return 1;
 33 }
 34 
 35 /*    遍历打印出链表中的元素    */
 36 void printList(LNode *h)
 37 {
 38     LNode *p;
 39     p = h->next;
 40 
 41     while(p != NULL){
 42         printf("%c",p->data);
 43         p = p->next;
 44     }
 45 }
 46 
 47 /*    计算链表的长度,即链表中有几个元素    */
 48 int lengthList(LNode *h)
 49 {
 50     LNode *p;
 51     int len = 0;
 52     p = h->next;
 53 
 54     while(p != NULL){
 55         len++;
 56         p = p->next;
 57     }
 58 
 59     return len;
 60 }
 61 
 62 /**    把元素 e 插入到链表中的第 n 个位置。
 63  *    成功返回1,失败返回0
 64  **/
 65 int insertList(LNode *h, char e, int n)
 66 {
 67     LNode *p, *s;
 68     int i = 1;
 69     p = h->next;
 70 
 71     while(p!=NULL && i<n){
 72         ++i;
 73         p = p->next;
 74     }
 75 
 76     if(n>0 && i==n){
 77         s = (LNode*)malloc(sizeof(LNode));
 78         if(s == NULL)
 79             return 0;
 80         s->data = e;
 81         s->next = p->next;
 82         p->next = s;
 83         return 1;
 84     }
 85     else
 86         return 0;
 87 }
 88 
 89 /**    删除链表中 第 n 个元素,
 90  *    成功返回1,失败返回0
 91  **/
 92 int deleteList(LNode *h, int n)
 93 {
 94     LNode *p, *q;
 95     int i = 1;
 96     p = h->next;
 97 
 98     while(p!=NULL && i<n-1){//找到要删除的节点位置
 99         ++i;
100         p = p->next;
101     }
102     if(n>0 && i==n-1){
103         q = p->next;//q指向要删除的节点
104         p->next = q->next;
105         free(q);
106         return 1;
107     }
108     else
109         return 0;
110 }
111 
112 /*    找到元素 e 在链表中的位置    */
113 int locate(LNode *h , char e)
114 {
115     LNode *p;
116     int n = 0;
117     p = h->next;
118     
119     while(p!=NULL && p->data!=e){
120         p = p->next;
121         n++;
122     }
123     if(p != NULL){
124         return n;
125     }
126     else
127         return 0;
128 }
129 
130 /*    释放单链表中所有的节点,使之成为空表    */
131 void clearList(LNode *h)
132 {
133     LNode * p;
134 
135     if(h == NULL)
136         return;
137 
138     while(h->next != NULL){
139         p = h->next;
140         free(h);
141         h = p;
142     }
143 
144 }

 

posted @ 2012-06-30 19:17  HandsomeDragon  阅读(305)  评论(0)    收藏  举报