线性表的链式存储结构的实现及其应用(C/C++实现)

简介: 存档----------- 1 #include 2 typedef char ElemType; 3 #include "LinkList.h" 4 void main() 5 { 6 LinkList h; 7 ElemType e; 8 ...

存档-----------

 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)初始化单链表h\n";
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)释放单链表h\n";
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 }

运行结果如下:

 

目录
相关文章
|
2天前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
24 12
|
1月前
|
存储 算法 C++
【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】
本任务要求编写程序实现图的邻接矩阵和邻接表的存储。需掌握带权有向图、图的邻接矩阵及邻接表的概念。邻接矩阵用于表示顶点间的连接关系,邻接表则通过链表结构存储图信息。测试输入为图的顶点数、边数及邻接矩阵,预期输出为Prim算法求解结果。通关代码提供了完整的C++实现,包括输入、构建和打印邻接矩阵与邻接表的功能。
50 10
|
1月前
|
存储 算法 测试技术
【C++数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】
本任务要求编写程序求两个集合的并集、交集和差集。主要内容包括: 1. **单链表表示集合**:使用单链表存储集合元素,确保元素唯一且无序。 2. **求并集**:遍历两个集合,将所有不同元素加入新链表。 3. **求交集**:遍历集合A,检查元素是否在集合B中存在,若存在则加入结果链表。 4. **求差集**:遍历集合A,检查元素是否不在集合B中,若满足条件则加入结果链表。 通过C++代码实现上述操作,并提供测试用例验证结果。测试输入为两个集合的元素,输出为有序集合A、B,以及它们的并集、交集和差集。 示例测试输入: ``` a c e f a b d e h i ``` 预期输出:
43 7
|
1月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
42 5
|
1月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
42 5
|
1月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
56 5
|
4月前
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
|
4月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
105 2
|
5月前
|
C++
【C++基础】程序流程结构详解
这篇文章详细介绍了C++中程序流程的三种基本结构:顺序结构、选择结构和循环结构,包括if语句、三目运算符、switch语句、while循环、do…while循环、for循环以及跳转语句break、continue和goto的使用和示例。
95 2
|
2天前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。