一.简述

  【暂无】

  二.头文件

  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
View Code

相关文章: