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

  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 }

 

posted @ 2015-03-11 20:57  橙子123  阅读(166)  评论(0编辑  收藏  举报