数据结构(C语言版)---第二章2.8-2.11 动态链表
主要实现以下几个接口:
1. 顺序创建动态链表。
2. 打印所有链表内容。
3. 取得特定位置的链表内容。
4. 向指定位置插入链表元素。
5. 将两个链表整合成一个链表。
具体代码如下,实现还是生成动态库。
LinkList.h
#ifndef _LINK_LIST_H #define _LINK_LIST_H #include <stdio.h> #include <stdlib.h> #include <string.h> #define OK 1 #define ERROR -1 typedef int ElemType; typedef int Status; typedef struct LNode_ { ElemType data; struct LNode_ *next; }LNode,*PLinkList; PLinkList CreateLinkList(PLinkList L,int n); void PrintLinkList(PLinkList L); void DestoryLinkList(PLinkList L); Status GetElem(PLinkList L,int turn, ElemType *pe); Status ListInsert(PLinkList L,int turn,ElemType e); Status ListDelete(PLinkList L,int turn, ElemType *pe); #endif
LinkList.c
#include "LinkList.h" /*2.8------2.11*/ PLinkList CreateLinkList(PLinkList L,int n) { PLinkList p,p_head,p_temp; L = (PLinkList )malloc(sizeof(LNode)); if(!L) { exit(0); } L->data = 0; L->next = NULL; p_head = L; int i = 0; int j = 0; p_temp = p_head; for(;i < n ; i++) { p = (PLinkList )malloc(sizeof(LNode)); if(!p) { exit(0); } p->data = n*i - 4; //get the head if(p_temp->next) { #if 0 p_temp = p_head; for(j = 0 ; j < p_head->data ; j++) { p_temp = p_temp->next; } #endif p_temp = p_temp->next; } p_temp->next = p; p->next = NULL; p_head->data += 1; } return L; } void PrintLinkList(PLinkList L) { int i = 0; PLinkList p; p = L; int len = p->data; for(; i < len ; i++) { p = p->next; printf("%d/%d: %p %d\n",i,len,p,p->data); } printf("\n"); } void DestoryLinkList(PLinkList L) { int i = 0; PLinkList p; p = L; int len = p->data; for(;i < len ; i++) { p = p->next; free(p); } } Status GetElem(PLinkList L,int turn, ElemType *pe) { PLinkList p; p = L; int i = 0; if((turn < 0 )|| (turn > p->data)) { return -1; } for(; i < turn ; i++) { p = p->next; } if(!p) { return -2; } *pe = p->data; printf("%d in the list is %d\n\n",turn,*pe); return OK; } Status ListInsert(PLinkList L,int turn,ElemType e) { PLinkList p; p = L; int i = 0; if((turn < 0 )) { return -1; } //get the elem just before turn for(; i < turn-1 ; i++) { p = p->next; } if(!p) { return -2; } PLinkList q; q = (PLinkList)malloc(sizeof(LNode)); if(!q) { exit(0); } q->data = e; //turn the pointer to next q->next = p->next; p->next = q; L->data += 1; //printf("------%d\n",L->data); return OK; } Status ListDelete(PLinkList L,int turn, ElemType *pe) { PLinkList p,q; p = L; int i = 0; if((turn < 0 )|| (turn > p->data)) { return -1; } //get the elem just before turn for(; i < turn-1 ; i++) { p = p->next; } if(!p) { return -2; } q = p->next;//Notice !!! if do like this , will get wrong, q = p; free(q->next); !!! *pe = p->next->data; p->next = p->next->next; free(q); printf("%d in the list : %d deleted\n\n",turn,*pe); L->data -= 1; return OK; } Status MergeList(PLinkList La,PLinkList Lb,PLinkList Lc) { int i = 0; int len_a = La->data; int len_b = Lb->data; PLinkList p,q,r; p = La; q = Lb; p = p->next; q = q->next; Lc = r = La; while((p) && (q)) { if(p->data <= q->data) { r->next = p; r = p; p = p->next; } else { r->next = q; r = q; q = q->next; } } if(p) { r->next = p; } if(q) { r->next = q; } Lc->data = len_a+len_b; PrintLinkList(Lc); return OK; }
编译成动态库: gcc LinkList.c -fPIC -shared -o libLinkList.so
测试主程序 Test_2.c
#include "LinkList.h" int main(int argc,char ** argv) { PLinkList p; p = CreateLinkList(p,10); printf("--------------------p--------------------\n"); PrintLinkList(p); int a = 0; GetElem(p,6, &a); printf("-------------------- insert p 188/8--------------------\n"); ListInsert(p,8,188); PrintLinkList(p); printf("--------------------delete p 4--------------------\n"); ListDelete(p, 4,&a); PrintLinkList(p); PLinkList q; q = CreateLinkList(q,5); printf("--------------------q--------------------\n"); PrintLinkList(q); printf("--------------------p + q--------------------\n"); PLinkList r; MergeList(p,q,r); DestoryLinkList(p); DestoryLinkList(q); exit(0); }
编译运行:gcc -o test_2 test_2.c ./libLinkList.so
运行结果:
root@ubuntu:/mnt/hgfs/E/Lessons/MyExercise/DS/2# ./test_2
--------------------p--------------------
0/10: 0x8cc0018 -4
1/10: 0x8cc0028 6
2/10: 0x8cc0038 16
3/10: 0x8cc0048 26
4/10: 0x8cc0058 36
5/10: 0x8cc0068 46
6/10: 0x8cc0078 56
7/10: 0x8cc0088 66
8/10: 0x8cc0098 76
9/10: 0x8cc00a8 86
6 in the list is 46
-------------------- insert p 188/8--------------------
0/11: 0x8cc0018 -4
1/11: 0x8cc0028 6
2/11: 0x8cc0038 16
3/11: 0x8cc0048 26
4/11: 0x8cc0058 36
5/11: 0x8cc0068 46
6/11: 0x8cc0078 56
7/11: 0x8cc00b8 188
8/11: 0x8cc0088 66
9/11: 0x8cc0098 76
10/11: 0x8cc00a8 86
--------------------delete p 4--------------------
4 in the list : 26 deleted
0/10: 0x8cc0018 -4
1/10: 0x8cc0028 6
2/10: 0x8cc0038 16
3/10: 0x8cc0058 36
4/10: 0x8cc0068 46
5/10: 0x8cc0078 56
6/10: 0x8cc00b8 188
7/10: 0x8cc0088 66
8/10: 0x8cc0098 76
9/10: 0x8cc00a8 86
--------------------q--------------------
0/5: 0x8cc00c8 -4
1/5: 0x8cc00d8 1
2/5: 0x8cc00e8 6
3/5: 0x8cc00f8 11
4/5: 0x8cc0108 16
--------------------p + q--------------------
0/15: 0x8cc0018 -4
1/15: 0x8cc00c8 -4
2/15: 0x8cc00d8 1
3/15: 0x8cc0028 6
4/15: 0x8cc00e8 6
5/15: 0x8cc00f8 11
6/15: 0x8cc0038 16
7/15: 0x8cc0108 16
8/15: 0x8cc0058 36
9/15: 0x8cc0068 46
10/15: 0x8cc0078 56
11/15: 0x8cc00b8 188
12/15: 0x8cc0088 66
13/15: 0x8cc0098 76
14/15: 0x8cc00a8 86
root@ubuntu:/mnt/hgfs/E/Lessons/MyExercise/DS/2#
其中不足之处,望朋友们不吝指正,谢谢!