单链表的基本实现
Posted dkbob
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表的基本实现相关的知识,希望对你有一定的参考价值。
编程过程:
1:动笔加思考(最重要的是思考,别直接去看别人的代码实现)
2:上机敲代码
3:查看运行结果
4:操作有问题则针对每个操作仔细分析
5:百思不得其解则百度或者查阅资料
#include<iostream>
using namespace std;
//单链表基本操作的实现
//头结点存放表长等数据;
//头指针可指向首元节点,头结点
typedef struct list
{
int age;
struct list* next;
}lnode, *linklist;
void initiallist(linklist &l)
{
l->next = NULL;
cout << "初始化成功" << endl;
return;
}//单链表的初始化
void listisempty(linklist &l)
{
if (l->next == NULL)
{
cout << "该表是空表" << endl;
return;
}
else
cout << "该表不是空表" << endl;
return;
}//判断单链表是不是空表
void listdestory(linklist& l)
{
list * lnode;
lnode = l;
while (l)//不能用l;
{
lnode = l;
l = l->next;
delete lnode;
}
}//单链表的销毁操作//头指针头结点都不存在;
void listempty(linklist& l)
{
list* p,* q;
p=l->next;
while(p)
{
q=p->next;
delete p;
p=q;
}
l->next=NULL;
}
//只保留头结点和destory区别开来;
int listlength(linklist& l)
{
list *p;
p=l->next;
int length=0;
while(p)
{
length++;
p=p->next;
}
return length;
}//求单链表的长度:
void listfind1(linklist& l)
{
int t;
int i;
linklist p;
p = l;
cout << "请输入你要查找元素的位置" << endl;
cin >> t;
if (t < 1 || t>listlength(l))
{
cout << "error" << endl;
return;
}
else
{
for (i = 1; i <= t; i++)
{
p = p->next;
}
cout << "第i个位置的元素为" << p->age << endl;
return;
}
}//取第i个位置的元素;
void listfind2(linklist& l)
{
int t;
int i = 1;
linklist p;
p = l->next;
cout << "请输入查找元素的值" << endl;
cin >> t;
for (i = 1; i <= listlength(l); i++)
{
if (p->age == t)
{
break;
}
else
{
p = p->next;
}
}
cout << "查找到其位置是" << i << endl;
}//按值查找元素位置
void listinsert(linklist& l)
{
int t, i;//i为计数器
linklist p;
p = l->next;//指向首元结点
linklist m=new list;
cout << "请输入新结点的数据的年龄" << endl;
cin >> m->age;
cout << "请输入插入结点的位置" << endl;
cin >> t;//要找到t-1结点位置;
for (i = 1; i < t - 1; i++)
{
p = p->next;
}
m ->next= p->next;
p->next = m;
}//在第i个结点前插入
void listdelete(linklist& l)
{
int t,i=1;
linklist p;
linklist q;
p = l;
cout << "请输入删除结点的位置" << endl;
cin >> t;
if (t == 1)
{
p->next = p->next->next;
}
else if (t==listlength(l))
{
for (i = 1; i <=t-1; i++)
{
p = p->next;
}
p->next = NULL;
}
else if (t > 1 && t < listlength(l))
{
for (i = 1; i<=t-1; i++)
{
p = p->next;
}
q = p->next;
cout << "删除结点的数据为" << q->age << endl;//输出结点数据
p->next = p->next->next;
delete q;//把删除结点删除
}
}//删除某个结点
void inserthead(linklist& l)
{
int count,i;
cout << "请输入创建节点个数" << endl;
cin >> count;
for (i=1; i <= count; i++)
{
linklist p=new list;
cout << "请输入第" << i << "个结点的年龄" << endl;
cin >> p->age;
p->next = l->next;
l->next = p;
}
}//头插法
void insertrear(linklist& l)
{
linklist t;
int i;
t = l;
int j;
cout << "请输入结点个数" << endl;
cin >> j;
for (i = 1; i <= j; i++)
{
linklist p = new list;
cout << "请输入第"<<i<<"个结点的年龄" << endl;
cin >> p->age;
t->next = p;
t = p;
}
t->next = NULL;
}//尾插法
void listallput( linklist& l)
{
linklist p;
int i = 1;
p = l->next;
cout << "如果为头插法则最后输入最先输出" << "尾插法则反之" << endl;
while (p)
{
cout <<"第"<<i<<"个数据为"<< p->age << endl;
p = p->next;
i++;
}
}//将整个链表的数据输出
void insertleast(linklist& l)
{
linklist p;
p = l;
linklist q = new list;
cout << "请输入结点的数据" << endl;
cin >> q->age;
if (p ->next== NULL)
{
p->next = q;
q->next = NULL;
}
else
{
while (p->next != NULL)
{
p = p->next;
}
q->next = p->next;
p->next = q;
}
}//链表最后插入数据
int main()
{
list* head;
head = new list;
int i, j, m;
cout << "请输入下列选项" << endl;
cout << "1:链表初始化" << "2:链表头插法" << "3:链表尾插法" << endl;
cout << "4:在某结点前插入" << "5:删除某结点" << endl;
cout << "6:根据位置查找元素的信息" << "7:根据元素的信息查找元素的位置" << endl;
cout << "8:链表的销毁" << "9:链表清空保留头结点" <<"10:判断链表是否为空链表" << endl;
cout << "11:求链表的长度" <<"12:链表全部输出"<< "13:在链表最后插入结点"<<endl;
cin >> m;
while (1)
{
switch (m)
{
case 1:initiallist(head); break;//head 初始化的话不能对其内容赋值操作;如果形参用&可以不初始化
case 2:inserthead(head); break;//头插法
case 3:insertrear(head); break;//尾插法
case 4:listinsert(head); break;//在某结点前插入
case 5:listdelete(head); break;//删除某个结点
case 6 :listfind1(head); break;//根据位置查找元素的信息
case 7:listfind2(head); break;//根据元素的信息查找元素的位置
case 8:listdestory(head); break;//链表的销毁
case 9:listempty(head); break;//链表清空保留头结点
case 10:listisempty(head); break;//判断链表是否为空链表
case 11:cout << "链表长度为" << listlength(head) << endl; break;//求链表的长度
case 12:listallput(head); break;
case 13:insertleast(head); break;
}
cout << "退出请输入0" << endl;
cin >> m;
if (m == 0)
{
break;
}
}
cout << "谢谢您的使用" << endl;
return 0;
}
————————————————
版权声明:本文为CSDN博主「迪克鲍勃必须勃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_52913841/article/details/117229090
以上是关于单链表的基本实现的主要内容,如果未能解决你的问题,请参考以下文章