单链线性表


  1 /**
2 * @brief 线性表的链式表示与实现
3 *
4 * @author amur-leopard
5 *
6 * @date 2014/06/01
7 */
8 #include <stdio.h>
9 #include <stdlib.h>
10
11 //-----------------预定义常量和类型-------------------
12 #define OK 1
13 #define ERROR 0
14 #define OVERFLOW -1
15
16 typedef int status; // 函数类型,其值是函数结果状态代码
17
18
19 //--------------线性表的单链表存储结构----------------
20 struct node
21 {
22 int data;
23 struct node *next;
24 };
25
26 typedef struct node node;
27 typedef struct node *link_list;
28
29
30 //------------------基本操作的声明--------------------
31 status init(link_list &list); // 初始化线性表
32 status insert(link_list &list, int i, int e); // 向线性表中某个位置前插入新元素
33 status list_delete(link_list &list, int i, int &e); // 删除线性表中某个位置的元素
34 status print(link_list list); // 打印线性表
35
36
37 //------------------基本操作的实现--------------------
38 /**
39 * @brief 初始化线性表
40 *
41 * @param 待初始化的线性表
42 *
43 * @return 函数状态
44 */
45 status init(link_list &list)
46 {
47 list = (node *)malloc(sizeof(node));
48 if(!list)
49 {
50 exit(OVERFLOW);
51 }
52 list->next = NULL;
53 return OK;
54 }
55
56 /**
57 * @brief 向线性表中某个位置前插入新元素
58 *
59 * @param list 待插入的线性表(list != NULL)
60 * @param i 插入位置(1<=i<=list_length+1)
61 * @param e 待插入的元素
62 */
63 status insert(link_list &list, int i, int e)
64 {
65 int j; // 用于计数
66 node *p; // 用于遍历并最终指向插入结点的前驱
67 node *n; // 用于存储新结点
68 if(!list)
69 {
70 return ERROR;
71 }
72 if(i < 1)
73 {
74 return ERROR;
75 }
76 for(p = list, j = 0; p && j < i - 1; p = p->next, ++j) // 寻找插入结点的前驱
77 {
78 }
79 if(!p) // i > list_length + 1;
80 {
81 return ERROR;
82 }
83 n = (node *)malloc(sizeof(node));
84 if(!n)
85 {
86 exit(OVERFLOW);
87 }
88 n->data = e;
89 n->next = p->next;
90 p->next = n;
91 return OK;
92 }
93
94 /**
95 * @brief 删除线性表中某个位置的元素
96 *
97 * @param list 待删除元素所在的线性表(list != NULL)
98 * @param i 删除位置(1<=i<=list_length)
99 * @param e 用于返回待删除元素
100 *
101 * @return 函数状态
102 */
103 status list_delete(link_list &list, int i, int &e)
104 {
105 int j; //用于计数
106 node *p; // 用于遍历并最终指向待删除结点的前驱
107 node *temp; // 用于指向待删除结点
108 if(!list)
109 {
110 return ERROR;
111 }
112 if(i < 1)
113 {
114 return ERROR;
115 }
116 for(p = list, j = 0; p->next && j < i - 1; p = p->next, ++j) // 寻找删除结点的前驱
117 {
118 }
119 if(!p->next) // i > list_length
120 {
121 return ERROR;
122 }
123 temp = p->next;
124 p->next = temp->next;
125 e = temp->data;
126 free(temp);
127 return OK;
128 }
129
130 /**
131 * @brief 打印线性表
132 *
133 * @param 待打印的线性表
134 *
135 * @return 函数状态
136 */
137 status print(link_list list)
138 {
139 node *p; // 用于遍历
140 if(!list)
141 {
142 return ERROR;
143 }
144 p = list->next;
145 if(p)
146 {
147 printf("%d", p->data);
148 p = p->next;
149 while(p)
150 {
151 printf(" %d", p->data);
152 p = p->next;
153 }
154 printf("\n");
155 }
156 return OK;
157 }
158
159
160 //----------------------测试--------------------------
161 /**
162 * @brief 测试函数
163 */
164 void main()
165 {
166 int e; link_list list = NULL; init(list);
167
168 if(OK == print(list)) printf("print succeed!\n");
169
170 if(OK == insert(list, 1, 11)) printf("insert (1, 11) succeed!\n"); print(list);
171 if(OK == insert(list, 2, 22)) printf("insert (2, 22) succeed!\n"); print(list);
172 if(OK == insert(list, 1, 33)) printf("insert (1, 33) succeed!\n"); print(list);
173 if(OK == insert(list, 2, 44)) printf("insert (2, 44) succeed!\n"); print(list);
174 if(OK == insert(list, 3, 55)) printf("insert (3, 55) succeed!\n"); print(list);
175
176 if(OK == list_delete(list, 5, e)) printf("delete (5, %d) succeed!\n", e); print(list);
177 if(OK == list_delete(list, 2, e)) printf("delete (2, %d) succeed!\n", e); print(list);
178 if(OK == list_delete(list, 1, e)) printf("delete (1, %d) succeed!\n", e); print(list);
179 if(OK == list_delete(list, 1, e)) printf("delete (1, %d) succeed!\n", e); print(list);
180 if(OK == list_delete(list, 1, e)) printf("delete (1, %d) succeed!\n", e); print(list);
181
182 if(OK == print(list)) printf("print succeed!\n");
183
184 system("pause");
185 }

单链线性表

时间: 2024-10-07 00:01:32

单链线性表的相关文章

线性表的链式表示和实现

本节内容讨论的线性表的另一种表示方法----链式存储结构,由于它不要求逻辑上相邻的元素在物理位置上也相邻,因此它没有顺序存储结构所具有弱点,但同时也失去了顺序表可随机存取的优点. 1.线性链表 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的).因此,为了表示每个数据元素ai与其直接后续数据元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示直接后继的信息(即直接后继的存储位置).这两部分信息组

04.线性表(三)链式存储结构.单链表2

链式存储结构.单链表2 顺序存储结构的创建实质是一个数组的初始化,存储空间连续且其大小和类型已经固定:单链表存储空间不连续,是一种动态结构且它所占用空间的大小和位置是不需要预先分配划定的,可以根据系统的情况和实际的需求即时生成. 一.单链表的整表创建 创建单链表的过程就是一个动态生成链表的过程,即从"空表"的初始化起,依次建立各元素结点,并逐个插入链表. 1.算法思路 (1)声明一个结点p和计数器变量i; (2)初始化一空链表L (3)让链表L的头结点的指针指向NULL,即建立一个带头

单位员工通讯录管理系统(线性表的应用)

[问题描述] 为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公室电话.手机号.及电子邮箱.其功能包括通讯录链表的建立.员工通讯信息的查询.修改.插入与删除.以及整个通讯录表的输出. [实现提示] 可以采用单链表的存储结构,如可定义如下的存储结构: typedef struct {  /*员工通讯信息的结构类型定义*/ char num[5];       /*员工编号*/ char name[10];      /*员工姓名*/ char phone[15];     /*办公

[大话数据结构]线性表之单链表结构和顺序存储结构

线性表定义: 零个或者多个数据元素的有限序列.元素之间是有顺序的,如果元素存在多个,则第一个元素无前驱,最后一个元素无后继.其他每个元素都有且只有一个前驱和后继.并且数据元素的类型要相同. 线性表的抽象数据类型: ADT 线性表(List) Data 线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType. 其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素. 数据元素之间的关系是一对一的关系.

大话数据结构之二(线性表)

线性表的抽象数据类型 什么是线性表.线性表其实就是零个或多个数据元素的有限序列. 在较复杂的线性表中,一个数据元素可以由若干个数据项组成 线性表的抽象数据类型如下: 线性表的顺序存储结构 事实上我们可以用c语言的一维数组来实现顺序存储结构,源码如下: #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "t

数据结构------线性表的链式表示与实现

不多说直接上代码: #include"stdafx.h" #include <stdio.h> #include <stdlib.h> /****************************************************************************** /* 数据类型和常量定义 /***********************************************************************

线性表(List) 二

线性表的链式存储结构 概念 为了表示每个数据元素 ai 与其直接后继元素 ai+1 之间的逻辑关系,对于数据元素 ai 来说,除了要存储其本身的信息之外,还需要存储一个指示其直接后继的信息(即直接后继的物理位置). 将存储数据元素信息的域称为数据域,把存储直接后继位置的域成为指针域.指针域中存储的信息成为指针或链,这两个部分信息组成数据元素 ai 的存储映像,称为结点(Node). n个结点( ai 的存储映像)链结成一个链表,即为线性表 a1,a2,...,an 的链式存储结构,因此此链表的每

数据结构——线性表

提示:以下内容不适合零基础人员,仅供笔者复习之用. 一.线性结构的基本特征: 1.集合中必存在唯一的一个"第一元素": 2.集合中必存在唯一的一个 "最后元素": 3.除最后元素在外,均有 唯一的后继: 4.除第一元素之外,均有 唯一的前驱. 如:java中的List接口,就是线性表.ArrayList就是顺序线性表,LinkedList就是链表线性表. 二.线性表的基本操作: 1.InitList(*L): 初始化操作,建立一个空的线性表L. 2.ListEmpt

数据结构算法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:[email protected] 7 date:2016-6-4 8 note:realize my textbook <<数据结构(C语言版)>> 9 */ 10 //----线性表的单链表存储结构---- 11 /** 12 My Code 13 to mak