线性表的链式存储结构的实现及其应用(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 }

运行结果如下:

 

目录
相关文章
|
11天前
|
编译器 C++
【C++核心】函数的应用和提高详解
这篇文章详细讲解了C++函数的定义、调用、值传递、常见样式、声明、分文件编写以及函数提高的内容,包括函数默认参数、占位参数、重载等高级用法。
14 3
|
11天前
|
C++
【C++基础】程序流程结构详解
这篇文章详细介绍了C++中程序流程的三种基本结构:顺序结构、选择结构和循环结构,包括if语句、三目运算符、switch语句、while循环、do…while循环、for循环以及跳转语句break、continue和goto的使用和示例。
15 2
|
2月前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
37 2
|
2月前
|
C++ 容器
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——AVL树
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——AVL树
27 5
|
2月前
|
存储 搜索推荐 Serverless
【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
30 1
|
3月前
|
存储 Prometheus Cloud Native
SLS Prometheus存储问题之为什么SLS时序引擎最终选择了使用C++实现PromQL的部分算子
SLS Prometheus存储问题之为什么SLS时序引擎最终选择了使用C++实现PromQL的部分算子
|
2月前
|
存储 编译器 C++
C++多态实现的原理:深入探索与实战应用
【8月更文挑战第21天】在C++的浩瀚宇宙中,多态性(Polymorphism)无疑是一颗璀璨的星辰,它赋予了程序高度的灵活性和可扩展性。多态允许我们通过基类指针或引用来调用派生类的成员函数,而具体调用哪个函数则取决于指针或引用所指向的对象的实际类型。本文将深入探讨C++多态实现的原理,并结合工作学习中的实际案例,分享其技术干货。
55 0
|
2月前
|
C++
c++学习笔记03 程序流程结构
C++学习笔记,主要介绍了程序流程结构,包括顺序结构、选择结构和循环结构。选择结构中详细解释了if语句、三目运算符和switch语句的用法和注意事项。循环结构部分则涵盖了while循环、do-while循环和for循环的语法和使用技巧。此外,还介绍了跳转语句,包括break、continue和goto语句的用途和用法。
29 0
|
2月前
|
JSON Android开发 C++
Android c++ core guideline checker 应用
Android c++ core guideline checker 应用
|
2月前
|
关系型数据库 C++ 容器
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——红黑树
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——红黑树
28 0
下一篇
无影云桌面