#include <iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;
// 尾插法创建链表
LNode *creatMyLinkList()
{
LNode *L;
int n;
cout<<"请输入创建的链表长度:";
cin>>n;
LNode *r, *s;
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
int x;
cout<<"请输入创建的链表的数据:";
for(int i = 0; i < n; i++)
{
cin>>x;
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = NULL;
if(L->next == NULL)
{
L->next = s;
}
else
{
r->next = s;
}
r = s;
}
if(r->next != NULL)
{
r->next = NULL;
}
return L;
}
//头插法创建链表
LNode *creatMyLinkListF()
{
LNode *L, *r = NULL, *s;
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
int n;
cout<<"请输入创建的链表长度:";
cin>>n;
int x;
cout<<"请输入创建的链表的数据:";
for (int i = 0; i < n;i++)
{
cin>>x;
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = r;
L->next = s;
r = s;
}
return L;
}
//打印输出链表
void printfMyLinkList(LNode *H)
{
LNode *p;
p = H;
cout<<"该链表是";
while(p->next)
{
p = p->next;
cout<<p->data<<' ';
}
cout<<endl;
}
// 计算链表长度
int lengthMyLinkList(LNode *H)
{
int i = 0;
LNode *p = H;
while(p->next)
{
p = p->next;
i++;
}
return i;
}
//查找
int findMyLinkList(LNode *H, int x)
{
LNode *p = H;
int i = 1;
while(p->next)
{
p = p->next;
if (p->data == x)
{
return i;
}
i++;
}
return -1;
}
//修改
bool changeMyLinkList(LNode *H, int x1, int x2)
{
LNode *p = H;
bool flag = false;
while (p->next)
{
p = p->next;
if(p->data == x1)
{
p->data = x2;
flag = true;
}
}
return flag;
}
//删除
void deleteMyLinkList(LNode *H,int x)
{
LNode *p = H;
LNode *s;
bool flag = false;
while(p->next)
{
if(p->next->data == x)
{
s = p->next;
p->next = p->next->next;
free(s);
flag = true;
p = H;
continue;
}
p = p->next;
}
if(!flag)
{
cout<<"未找到删除的值。"<<endl;
}
}
//插入
bool insertMyLinkList(LNode *H, int x, int n)
{
LNode *p = H;
LNode *s;
s = (LNode *)malloc(sizeof(LNode));
s->data = n;
int y = lengthMyLinkList(H);
if(x < 0 || x > y)
{
cout<<"输入的位置超出范围。"<<endl;
return false;
}
else
{
for (int i = 0; i < x; i++)
{
p = p->next;
}
}
s->next = p->next;
p->next = s;
return true;
}
int main()
{
while (1)
{
int i,find_x, find_y, change_x1,change_x2, delete_n, insert_x,insert_n;
bool change_flag, insert_flag;
LNode *H;
cout<<"--------------------------"<<endl;
cout<<"请输入以下操作 :"<<endl;
cout<<"1.用尾插法创建链表并输出。"<<endl;
cout<<"2.用头插法创建链表并输出。"<<endl;
cout<<"3.插入操作。"<<endl;
cout<<"4.删除操作。"<<endl;
cout<<"5.修改操作。"<<endl;
cout<<"6.查找操作。"<<endl;
cout<<"7.打印输出。"<<endl;
cout<<"8.计算链表长度。"<<endl;
cout<<"--------------------------"<<endl;
cout<<endl;
cin>>i;
system("cls");
switch(i)
{
case 1:
H = creatMyLinkList();//尾插法创建链表
break;
case 2:
H = creatMyLinkListF();//头插法创建链表
break;
case 3:
//插入
cout<<"请输入要插入的位置和插入的值:";
cin>>insert_x>>insert_n;
insert_flag = insertMyLinkList(H, insert_x, insert_n);
if(insert_flag)
printfMyLinkList(H);
else
cout<<"插入错误."<<endl;
break;
case 4:
cout<<"请输入需要删除的值:";//删除
cin>>delete_n;
deleteMyLinkList(H,delete_n);
printfMyLinkList(H);
break;
case 5:
cout<<"请输入修改前的值和修改后的值:";
cin>>change_x1>>change_x2;
change_flag = changeMyLinkList(H,change_x1, change_x2);
if(change_flag)
printfMyLinkList(H);
else
{
cout<<"修改错误."<<endl;
printfMyLinkList(H);
}
break;
case 6:
cout<<"请输入你想要查找的数据:";//查找
cin>>find_x;
find_y = findMyLinkList(H,find_x);
if(find_y == -1)
{
cout<<"没有找到。"<<endl;
}
else
{
cout<<find_x<<"是该链表的第"<<find_y<<"个数字。"<<endl;
}
break;
case 7:
printfMyLinkList(H);//打印输出
break;
case 8:
cout<<"该链表的长度为:"<<lengthMyLinkList(H)<<endl;
break;
default:
break;
}
}
return 0;
}
单链表的增删改查
最新推荐文章于 2024-07-17 12:13:29 发布