线性表的链式存储结构的实现及其应用(C/C++实现)
时间:2022-05-07
本文章向大家介绍线性表的链式存储结构的实现及其应用(C/C++实现),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
存档-----------
1 #include <iostream.h>
2 typedef char ElemType;
3 #include "LinkList.h"
4 void main()
5 {
6 LinkList h;
7 ElemType e;
8 int i=0;
9 int t=0;
10 cout<<"(1)初始化单链表hn";
11 InitList(h);
12 cout<<"(2)单链表为"<<(ListEmpty(h)?"空":"非空")<<endl;
13 cout<<"(3)依次输入字母序列,以'#'结束"<<endl;
14 cin>>e;
15 i=1;
16 while(e!='#')
17 {
18 ListInsert(h,i,e);
19 i++;
20 cin>>e;
21 }
22 cout<<"(4)输出单链表h:";
23 PrintList(h);
24 cout<<"(5)单链表h的长度="<<ListLength(h)<<endl;
25 cout<<"(5)单链表h为"<<(ListEmpty(h)?"空":"非空")<<endl;
26 cout<<"(6)测试GetElem(L,i,e)函数,请输入i的值"<<endl;
27 cin>>i;
28 t=GetElem(h,i,e);
29 if(t)
30 cout<<"(6)单链表h的第"<<i<<"个元素="<<e<<endl;
31 else
32 cout<<"(6)单链表h的第"<<i<<"个元素不存在n";
33 cout<<"(7)测试LocateElem(L,e)函数,请输入e的值"<<endl;
34 cin>>e;
35 t=LocateElem(h,e);
36 if(t)
37 cout<<"(7)元素"<<e<<"的位置="<<t<<endl;
38 else
39 cout<<"(7)元素"<<e<<"不存在n";
40 cout<<"(8)测试ListInsert(L,i,e)函数,请输入i的值和e的值"<<endl;
41 cout<<"请输入i的值:";
42 cin>>i;
43 cout<<"请输入e的值:";
44 cin>>e;
45 cout<<"(8)在第"<<i<<"个元素位置上插入"<<e<<"元素:";
46 t=ListInsert(h,i,e);
47 if(t)
48 cout<<"成功!n";
49 else
50 cout<<"失败!n";
51 cout<<"(9)输出单链表h:";
52 PrintList(h);
53 cout<<"(10)测试ListDelete(L,i,e)函数,请输入i的值"<<endl;
54 cin>>i;
55 cout<<"(10)删除h的第"<<i<<"个元素:";
56 t=ListDelete(h,i,e);
57 if(t)
58 cout<<"成功!n";
59 else
60 cout<<"失败!n";
61 cout<<"(11)输出单链表h:";
62 PrintList(h);
63 cout<<"(12)释放单链表hn";
64 DestoryList(h);
65 }
1 typedef struct LNode//定义单链表结点类型
2 {
3 ElemType data;
4 struct LNode *next;
5 }LNode,*LinkList;
6 int InitList(LinkList &L)
7 {
8 //初始化只含有头结点的空的单链表
9 L=new LNode;//创建头结点
10 if(L==NULL)
11 {
12 cout<<"结点分配失败n";
13 return 0;
14 }
15 L->next=NULL;
16 return 1;
17 }
18 void ClearList(LinkList &L)
19 {
20 //清空单链表,仅保留头结点
21 LinkList p;
22 while(L->next)
23 {
24 p=L->next;
25 L->next=p->next;
26 delete p;
27 }
28 }
29 int ListLength(LinkList L)
30 {
31 //返回单链表的长度
32 LinkList p=L;
33 int i=0;
34 while(p->next!=NULL)//数到最后一个结点为止
35 {
36 i++;
37 p=p->next;
38 }
39 return i;
40 }
41 void PrintList(LinkList L)
42 {
43 //顺序输出单链表中的各元素
44 LinkList p=L->next;
45 while(p!=NULL)
46 {
47 cout<<p->data<<" ";
48 p=p->next;
49 }
50 cout<<endl;
51 }
52 bool ListEmpty(LinkList L)
53 {
54 //判断是否为空链表
55 if(L->next==NULL)
56 return true;
57 else
58 return false;
59 }
60 int GetElem(LinkList L,int i,ElemType &e)
61 {
62 //用e返回单链表L中第i个元素的值
63 if(i<1)
64 return 0;
65 LinkList p=L->next;
66 int j=1;
67 while(j<i&&p!=NULL)
68 {
69 p=p->next;
70 j++;
71 }
72 if(p==NULL)//j<i,但p为空指针了,即i超出了[1...n]范围了
73 return 0;
74 else
75 {
76 e=p->data;
77 return 1;
78 }
79 }
80 int LocateElem(LinkList L,ElemType e)
81 {
82 //返回e元素在单链表L中的位序,若不存在,返回0
83 LinkList p=L->next;
84 int n=1;
85 while(p!=NULL&&p->data!=e)
86 {
87 p=p->next;
88 n++;
89 }
90 if(p==NULL)//直到最后也没找到等于元素e的结点
91 return 0;
92 else
93 return n;
94 }
95 int ListInsert(LinkList &L,int i,ElemType e)
96 {
97 //在单链表L的第i个数据元素之前插入数据元素e
98 if(i<1)
99 return 0;
100 int j=0;//在1号位置插入时,i-1号位置是0号位置
101 LinkList p=L,s;
102 while(j<i-1&&p!=NULL)//寻找第i-1个结点
103 {
104 p=p->next;
105 j++;
106 }
107 if(p==NULL)//未找到第i-1个结点,即i超出了[1..n+1]时
108 return 0;
109 else//找到第i-1个结点p
110 {
111 s=new LNode;//创建新结点s
112 if(s==NULL)
113 {
114 cout<<"结点分配失败n";
115 return 0;
116 }
117 s->data=e;
118 s->next=p->next;//将s插入到p之后
119 p->next=s;
120 return 1;
121 }
122 }
123 int ListDelete(LinkList &L,int i,ElemType &e)
124 {
125 //删除单链表L中第i个结点,并用e返回其值
126 if(i<1)
127 return 0;
128 LinkList p=L,q;
129 int j=0;
130 while(j<i-1&&(p->next)!=NULL)//寻找第i-1个结点,且第i-1号元素不是最后一个元素
131 {
132 p=p->next;
133 j++;
134 }
135 if((p->next)==NULL)//未找到第i-1个结点,即i超出了[1..n]
136 return 0;
137 else//找到第i-1个结点p
138 {
139 q=p->next;//q指向要删除的结点
140 p->next=q->next;//从单链表中删除q结点
141 e=q->data;
142 delete q;//释放q结点
143 return 1;
144 }
145 }
146 void DestoryList(LinkList &L)
147 {
148 //销毁单链表
149 LinkList p;
150 while(L)
151 {
152 p=L;
153 L=L->next;
154 delete p;
155 }
156 L=NULL;
157 }
运行结果如下:
- 静态页面设置缓存、动态页面设缓存(不断更新中。。。。)
- 区块链技术如何把你的游戏资产真正变为你的资产
- Python标准库07 信号 (signal包,部分os包)
- 当css属性width设为100%时
- GridView实战一:自定义分页、排序、修改、插入、删除
- Windows下程序打包发布时的小技巧
- Linux的“壳”
- 网页优化系列一:合并文件请求(asp.net版)
- Windows下Thumbnail的开发总结
- 剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)
- Linux架构
- 绘图: Python matplotlib简介
- 绘图: matplotlib Basemap简介
- GridView实战二:使用ObjectDataSource数据源控件(自定义缓存机制实现Sort)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浙大版《C语言程序设计(第3版)》题目集 练习2-10 计算分段函数[1]
- 浙大版《C语言程序设计(第3版)》题目集 练习2-11 计算分段函数[2]
- SAP Spartacus产品页面的normalizer
- Nodejs中使用net-snmp库读取智慧站房的温湿度、空调等实时数据
- 生气!面试官你过来,我给你手写一个Spring Aop实现!
- 浙大版《C语言程序设计(第3版)》题目集 练习2-12 输出华氏-摄氏温度转换表
- Linux下文本处理“三剑客”
- Thread和goroutine两种方式实现共享变量按序输出
- 浙大版《C语言程序设计(第3版)》题目集 练习2-13 求N分之一序列前N项和
- 浙大版《C语言程序设计(第3版)》题目集 练习2-14 求奇数分之一序列前N项和
- dotnet 双缓存数据结构设计 下载库的文件写入缓存框架
- 浙大版《C语言程序设计(第3版)》题目集 练习2-15 求简单交错序列前N项和
- 浙大版《C语言程序设计(第3版)》题目集 练习2-17 生成3的乘方表
- WPF 漂亮的现代化控件 新 ModernWPF 界面库
- 浙大版《C语言程序设计(第3版)》题目集 练习2-18 求组合数