数据结构-单向链表相关算法

  1 #include <stdio.h>

  2 #include <stdlib.h>

  3 #define OVERFLOW -2

  4 #define OK 1

  5 #define ERROR 0

  6 typedef int ElemType;

  7 

  8 typedef struct LNode {

  9     ElemType data;

 10     struct LNode *next;

 11 }LNode,*LinkList;

 12 

 13 LinkList CreateList_L(LinkList L,int n);

 14 void TraverseList_L(LinkList L);

 15 int GetElem_L(LinkList L,int i,ElemType *e);

 16 LinkList ListInsert_L(LinkList L,int i,ElemType e);

 17 LinkList ListDelete(LinkList L,int i,ElemType *e);

 18 LinkList MergeList_L(LinkList La,LinkList Lb,LinkList Lc);

 19 LocateList_L(LinkList L,ElemType e);

 20 LinkList InverseList_L(LinkList L);

 21 LinkList InitList_L(LinkList L);

 22 

 23 //初始化单链表

 24 LinkList InitList_L(LinkList L) {

 25     L = (LinkList)malloc(sizeof(LNode));

 26     L->next = NULL;

 27     return L;

 28 }

 29 //创建一个单向链表

 30 LinkList CreateList_L(LinkList L,int n) {

 31     int i;

 32     LinkList p;

 33     

 34     printf("请输入元素的值:");

 35     for(i=n; i>0; --i) {

 36         p = (LinkList)malloc(sizeof(LNode));

 37         scanf("%d",&p->data);

 38         p->next = L->next;

 39         L->next = p;

 40     }

 41     return L;

 42 }

 43 

 44 //遍历链表

 45 void TraverseList_L(LinkList L) {

 46     LinkList p;

 47     p = L->next;

 48     while(p) {

 49         printf("%d ",p->data);

 50         p = p->next;

 51     }

 52     printf("\n");

 53 }

 54 

 55 //取得链表上第i个元素

 56 int GetElem_L(LinkList L,int i,ElemType *e) {

 57     LinkList p;

 58     int j;

 59     p = L->next;

 60     j = 1;

 61     while(p && j<i) {

 62         p = p->next;

 63         ++j;

 64     }

 65     if(!p||j>i) return ERROR;

 66     *e = p->data;

 67     return OK;

 68 }

 69 

 70 //向链表中插入一个元素

 71 LinkList ListInsert_L(LinkList L,int i,ElemType e) {

 72     LinkList p,s;

 73     int j;

 74     p = L;

 75     j = 0;

 76     while(p && j<i-1) {

 77         p = p->next;

 78         ++j;

 79     }

 80     if(!p || j>i-1) return ERROR;

 81     s = (LinkList)malloc(sizeof(LNode));

 82     s->data = e;

 83     s->next = p->next;

 84     p->next = s;

 85     return L;

 86 }

 87 

 88 //从链表删除一个元素

 89 LinkList ListDelete(LinkList L,int i,ElemType *e) {

 90     LinkList p,q;

 91     int j;

 92     p = L;

 93     j = 0;

 94     while(p->next && j<i-1) {

 95         ++j;

 96         p = p->next;

 97     }

 98     if(!(p->next) || j>i-1) return ERROR;

 99     q = p->next;

100     p->next = q->next;

101     *e = q->data;

102     free(q);

103     return L;

104 }

105 

106 //将两个链表进行归并排序合并

107 LinkList MergeList_L(LinkList La,LinkList Lb,LinkList Lc) {

108     LinkList pa,pb,pc;

109     pa = La->next;

110     pb = Lb->next;

111     Lc = pc = La;

112     while(pa && pb) {

113         if(pa->data <= pb->data) {

114             pc->next = pa;

115             pc = pa;

116             pa = pa->next;

117         } else {

118             pc->next = pb;

119             pc = pb;

120             pb = pb->next;

121         }

122     }

123     pc->next = pa?pa:pb;

124     free(Lb);

125     return Lc;

126 }

127 

128 //取得某一个元素的位序

129 int LocateList_L(LinkList L,ElemType e) {

130     LinkList p;

131     int i;

132     p = L->next;

133     i = 0;

134     while(p) {

135         if(p->data == e) {

136             ++i;

137             break;

138         }

139         p = p->next;

140     }

141     if(p == NULL) {

142         return 0;

143     } else {

144         return i;

145     }

146 }

147 

148 //将单向链表逆置

149 LinkList InverseList_L(LinkList L) {

150     LinkList pre,cur,next;

151     pre = L->next;

152     cur = pre->next;

153     next = cur->next;

154     pre->next = NULL;

155     cur->next = pre;

156     pre = cur;

157     cur = next;

158     while(cur != NULL) {

159         next = cur->next;

160         cur->next = pre;

161         pre = cur;

162         cur = next;

163     }

164     L->next = pre;

165     return L;

166 }

167 

168 int main()

169 {

170     LinkList lin,lin1,lin2;

171     int n,e,i;

172     lin = InitList_L(lin);

173     lin1 = InitList_L(lin1);

174 

175     printf("请输入元素的个数: ");

176     scanf("%d",&n);

177     lin = CreateList_L(lin,n);

178 

179     printf("链表中的元素为: ");

180     TraverseList_L(lin);

181 

182     if(GetElem_L(lin,1,&e))

183     printf("第i个元素为:%d\n",e);

184 

185     lin = ListInsert_L(lin,1,6);

186     printf("插入一个元素后的链表为:");

187     TraverseList_L(lin);

188 

189     lin = ListDelete(lin,1,&e);

190     printf("删除一个元素后的链表为:");

191     TraverseList_L(lin);

192     printf("删除的元素为:%d\n",e);

193 

194     printf("请输入元素的个数: ");

195     scanf("%d",&n);

196     lin1 = CreateList_L(lin1,n);

197 

198     //合并后的链表为:

199     printf("合并后的链表为:");

200     lin2 = MergeList_L(lin,lin1,lin2);

201     TraverseList_L(lin2);

202 

203     //取得某一元素的位序为:

204     i = LocateList_L(lin2,3);

205     if(i == 0) {

206         printf("未找到该元素:\n");

207     } else {

208         printf("该元素的位序为:%d\n",i);

209     }

210     //将单向链表逆置

211     printf("逆置后的链表为: ");

212     lin = InverseList_L(lin);

213     TraverseList_L(lin);

214     return 0;

215 }

 

你可能感兴趣的:(数据结构)