数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表
一.简述
【暂无】
二.头文件
1 #ifndef _2_3_part1_H_ 2 #define _2_3_part1_H_ 3 //2_3_part1.h 4 /** 5 author:zhaoyu 6 email:zhaoyu1995.com@gmail.com 7 date:2016-6-4 8 note:realize my textbook <<数据结构(C语言版)>> 9 */ 10 //----线性表的单链表存储结构---- 11 /** 12 My Code 13 to make the paragram run correctlly 14 */ 15 #define ElemType int 16 typedef struct LNode{ 17 ElemType data; 18 struct LNode *next; 19 }LNode, *LinkList; 20 /** 21 algorithm 2.8 22 */ 23 Status GetElem_L(LinkList L, int i, ElemType &e) 24 { 25 //L为带头结点的单链表的头指针 26 //当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR 27 LinkList p = L->next; 28 int j = 1;//初始化,p指向第一个节点,j为计数器 29 while (p && j<i) 30 {//顺指针向后查找,直到p指向第i个元素或p为空 31 p = p->next; 32 ++j; 33 } 34 if (!p || j > i) 35 {//第i个元素不存在 36 return ERROR; 37 } 38 e = p->data;//取第i个元素 39 return OK; 40 }//GetElem_L 41 //关于指针的引用 42 /** 43 algorithm 2.9 44 */ 45 Status ListInsert_L(LinkList &L, int i, ElemType e) 46 { 47 //在带头结点的单链线性表L中第i个位置之前插入元素 48 LinkList p = L; 49 int j = 0; 50 while (p && j < i-1) 51 {//寻找第i-1个节点 52 p = p->next; 53 ++j; 54 } 55 if (!p || j>i-1) 56 {//i小于 1 或大于表长加 1 57 return ERROR; 58 } 59 LinkList s = (LinkList)malloc(sizeof(LNode)); 60 s->data = e;//插入 L 中 61 s->next = p->next;//注意顺序 62 p->next = s; 63 return OK; 64 }//ListInsert_L 65 66 /** 67 algorithm 2.10 68 */ 69 Status ListDelete_L(LinkList &L, int i, ElemType &e) 70 { 71 //在带头结点的单链线性表L中,删除第 i 个节点,并由 e 返回其值 72 LinkList p = L; 73 int j = 0; 74 while (p->next && j < i-1) 75 {//寻找第 i 个节点,并另 p 指向其前驱 76 p = p->next; 77 ++j; 78 } 79 if (!(p->next) || j > i-1) 80 {//删除位置不合理 81 return ERROR; 82 } 83 LinkList q = p->next; 84 p->next = q->next;//删除并释放节点 85 e = q->data; 86 free(q); 87 return OK; 88 }//ListDelete_L 89 /** 90 algorithm 2.11 91 从表尾到表头逆向建立单链表的算法 92 */ 93 void CreateList_L(LinkList &L, int n) 94 { 95 //逆位序输入 n 个元素的值,建立带表头节点的单链线性表 L 96 L = (LinkList)malloc(sizeof(LNode)); 97 L->next = NULL;//先建立一个带头结点的单链表 98 for (int i = n; i > 0; i--) 99 { 100 LinkList p = (LinkList)malloc(sizeof(LNode));//生成新节点 101 scanf("%d", &p->data);//输入元素值 102 p->next = L->next; 103 L->next = p;//插入到表头 104 } 105 }//CreateList_L 106 /** 107 algorithm 2.12 108 */ 109 void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc) 110 { 111 //已知单链线性表 La 和 Lb 的元素按值非递减排列 112 //归并 La 和 Lb 得到新的单链线性表 Lc,Lc的元素也按值非递减排列 113 LinkList pa = La->next, pb = Lb->next; 114 LinkList pc = Lc = La;//用 La 的头结点作为 Lc 的头结点 115 while (pa && pb) 116 { 117 if (pa->data <= pb->data) 118 { 119 pc->next = pa; 120 pc = pa; 121 pa = pa->next; 122 } 123 else 124 { 125 pc->next = pb; 126 pc = pb; 127 pb = pb->next; 128 } 129 } 130 pc->next = pa ? pa : pb;//插入剩余节点 131 free(Lb); 132 }//MergeList_L 133 134 /** 135 My Code 136 */ 137 void PrintList(LinkList L) 138 { 139 LinkList p = L->next; 140 while (p != NULL) 141 { 142 printf("%d\t", p->data); 143 p = p->next; 144 } 145 printf("\n"); 146 } 147 #endif
三.CPP文件
1 //2_3_part1.cpp 2 /** 3 author:zhaoyu 4 email:zhaoyu1995.com@gmail.com 5 date:2016-6-4 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 #include "head.h" 9 #include "2_3_part1.h" 10 int main(int argc, char const *argv[]) 11 { 12 LinkList La, Lb, Lc; 13 //逆序建表 14 printf("Create ListA\n"); 15 CreateList_L(La, 4); 16 printf("Create ListB\n"); 17 CreateList_L(Lb, 6); 18 printf("Print ListA\n"); 19 PrintList(La); 20 printf("Print ListB\n"); 21 PrintList(Lb); 22 printf("Insert 7 at location 4 In ListA\n"); 23 ListInsert_L(La, 4, 7); 24 PrintList(La); 25 printf("Delete 7 at location 3 In ListB\n"); 26 int temp; 27 ListDelete_L(Lb, 3, temp); 28 PrintList(Lb); 29 printf("%d is deleted\n", temp); 30 printf("Merge ListA and ListB\n"); 31 MergeList_L(La, Lb, Lc); 32 PrintList(Lc); 33 printf("Get element at location 1 2 3 in ListC\n"); 34 int e1, e2, e3; 35 GetElem_L(Lc,1,e1); 36 GetElem_L(Lc,2,e2); 37 GetElem_L(Lc,3,e3); 38 printf("%d\t%d\t%d\n", e1, e2, e3); 39 return 0; 40 }
四.测试