单链表的代码
文章目录
一、代码
二、运行结果
前言
这是及上一篇文章后写的代码。用的是c++
也可以用C语言只需微改一下即可。
一、代码
#include "iostream"
using namespace std;
typedef struct lnode {
int data;
struct lnode* next;
}lnode, *linklist;
//链表初始化
linklist initlist_l(linklist &l)
{
l = new lnode;
l->next = NULL;
return l;
}
//判断链表是否为空
bool listEmpty(linklist l)
{
if (l->next)
return 0;
else
return 1;
}
//销毁单链表
int Destroylist_l(linklist l)
{
linklist p;
while (l)
{
p = l;
l = l->next;
delete p;
}
return 1;
}
//清空链表
int clearlist(linklist &l)
{
linklist p, q;//u或linklist p,q;
p = l->next;
while (p) {
q = p->next;
delete p;
p = q;
}
l->next = NULL;
return 1;
}
//单链表的长度
int listlength_l(linklist l)
{
int i = 0;
linklist p;
p = l->next;
while (p) {
i++;
p = p->next;
}
return i ;
}
//取值--取链表中i位置的元素
void getelem_l(linklist l)
{
cout << "请输入链表中的位置i" << endl;
int i;
cin >> i ;
linklist p;
p = l->next;
int j = 1;
while (p && j < i) {
p = p->next;
++j;
}
if (!p || j > i)
cout << "查无此值" << endl;
if (p)
cout << "链表中第" << j << "位置上的值为" << p->data << endl;
}
//按值查找
void locateelem_l(linklist l)
{
cout << "请输入你想要查找的值" << endl;
linklist p;
p = l->next;
int j = 1,e;
cin >> e;
while (p && p->data != e)
{
p = p->next; j++;
}
if (p)
cout << "该值在第" << j << "的位置上" << endl;
else
cout << "查无此值" << endl;
}
//插入
void listlnsert_l(linklist l)
{
int i,e;
cin >> i>>e;
linklist p;
linklist s;
s = new lnode;
int j=1;
p = l->next;
while (p && j < i - 1)
{
p = p->next; ++j;//寻找第i-1个结点,p指向i-1结点
}
if (!p || j > i - 1)
cout << "插入失败" << endl;
s->data = e;//生成新结点s,将结点s的数据域为e;
s->next = p->next;
p->next = s;
}
//删除
void Listdelete_L(linklist l)
{
int i,e;
cin >> i;
linklist p;
linklist q;
int j=0;
p = l;
while (p && j < i - 1)
{
p = p->next; j++;
}//寻找第i个结点,并令p指向其前驱
if (!(p->next) || j > i - 1)
{
cout << "删除失败" << endl;
}
q = p->next;//临时保存被删除的结点以被释放
p->next = q->next;//改变删除结点前驱结点指针域
e = q->data;//保存删除结点的数据域
delete q;//释放空间c++
}
//遍历链表将链表中的每一个元素输出;
void printlist(linklist l)
{
linklist p = l->next;
while (p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
if (!p)
{
cout << "链表已空" << endl;
}
}
//创建单链表
linklist Creatlist(linklist l) {//头插法
l = new lnode;
l->next = NULL;//建立一个带头结点的单链表
int n;
cin >> n;
linklist p;
for (int i=n; i > 0; i--)
{
p = new lnode;//生成一个新节点c++
//p = (Lnode*)malloc(sizeof(Lnode));生成一个新节点c
cin >> p->data;
p->next = l->next;//插入到表头
l->next = p;
}
return l;
}
void menu()//还可以根据自己需要在添加其他功能
{
cout<<"********1、插入 2、删除*********"<<endl;
cout<<"********3、查找 4、取值*********"<<endl;
cout<<"********5、输出 6、退出*********"<<endl;
}
int main()
{
cout << "********创建单链表*******" << endl;
linklist l;
int choice=0;
l= initlist_l(l);
l=Creatlist(l);
while (1)
{
menu();
cout << "输入菜单号" << endl;
cin >> choice;
if (choice == 6)
break;
switch (choice)
{
case 1:listlnsert_l(l); break;
case 2:Listdelete_L(l); break;
case 3:locateelem_l(l); break;
case 4:getelem_l(l); break;
case 5:printlist(l); break;
default:cout << "输入错误" << endl;
}
}
}
二、运行结果
********创建单链表*******
5
1 3 4 5 6
********1、插入 2、删除*********
********3、查找 4、取值*********
********5、输出 6、退出*********
输入菜单号
5
6 5 4 3 1
链表已空
********1、插入 2、删除*********
********3、查找 4、取值*********
********5、输出 6、退出*********
输入菜单号
1
3 9
********1、插入 2、删除*********
********3、查找 4、取值*********
********5、输出 6、退出*********
输入菜单号
5
6 5 9 4 3 1
链表已空
********1、插入 2、删除*********
********3、查找 4、取值*********
********5、输出 6、退出*********
输入菜单号
2
3
********1、插入 2、删除*********
********3、查找 4、取值*********
********5、输出 6、退出*********
输入菜单号
5
6 5 4 3 1
链表已空
********1、插入 2、删除*********
********3、查找 4、取值*********
********5、输出 6、退出*********
输入菜单号
3
请输入你想要查找的值
1
该值在第5的位置上
********1、插入 2、删除*********
********3、查找 4、取值*********
********5、输出 6、退出*********
输入菜单号
4
请输入链表中的位置i
4
链表中第4位置上的值为3
********1、插入 2、删除*********
********3、查找 4、取值*********
********5、输出 6、退出*********
输入菜单号
6
D:\c++\2\x64\Debug\2.exe (进程 29432)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
希望对大家有些帮助。