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

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

  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 }

 

你可能感兴趣的:(单链表)