#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<windows.h>
using namespace std;
typedef struct Node
{
int number;//数据域
struct Node*next;//指针域
} Node,*Linklist;
//链表的初始化
void linklistIntit(Linklist &L)
{
L=(Linklist)malloc(sizeof(Node));
L->next=NULL;
}
//头插法创建链表
void linklistheadCreat1(Linklist &L,int n)
{
Linklist p;
for(int i=0; i<n; i++)
{
p=(Linklist)malloc(sizeof(Node));//开辟空间
cout<<"请你输入数据\n";
cin>>p->number;
p->next=L->next;
L->next=p;
}
}
//尾插法创建链表
void linklistheadCreat2(Linklist &L,int n)
{
Linklist rear=L;//定义rear由下下面操作(rear=p;)让rear始终指向尾部节点
for(int i=0; i<n; i++)
{
Linklist p=(Linklist)malloc(sizeof(Node));
cout<<"请输入数据\n";
cin>>p->number;
rear->next=p;
rear=p;
rear->next=NULL;//必不可少指向空
}
}
//遍历链表
void linklistTreavle(Linklist &L)
{
Linklist p;
p=L->next;
while(p)
{
printf("%d ",p->number);
p=p->next;
}
}
//查找指定元素
bool linklistLocate(Linklist &L,int data)
{
Linklist p;
p=L->next;
while(p)
{
if(p->number==data)
{
cout<<"已找到"<<data<<'\n';
return true;
}
p=p->next;
}
cout<<"抱歉没有您要的值!"<<'\n';
return false;
}
//指定位置插入指定元素
void linklistInsert(Linklist &L,int n,int data)
{
Linklist p;
p=L->next;
for(int i=0; i<n-1; i++)
{
p=p->next;
}
Linklist q=(Linklist)malloc(sizeof(Node));
q->number=data;
q->next=p->next;//顺序不能颠倒
p->next=q;
}
//删除指定元素
bool linklistDelete(Linklist &L,int data)
{
Linklist p,q;//两个指针使p始终在q的前一个,这样方便删除q之后做好接下来的连接工作
p=L;
q=L->next;
while(q)
{
if(q->number==data)
{
p->next=q->next;
free(q);
cout<<"找到并且删除!\n";
return true;
}
p=q;//使p始终在q的前面
q=q->next;
}
cout<<"不存在您找的值!\n";
return false;
}
//清空链表
void linklistClear(Linklist &L)
{
Linklist p=L;
while(L)
{
L=L->next;//先移动L
free(p);//再释放p
p=L;//再移动p
}
cout<<"链表清空完毕!\n";
}
//菜单
void linklistMenu()
{
cout<<"链表已经完成初始化"<<'\n';
cout<<"1.头插法建立链表"<<"2.尾插法建立链表"<<'\n';
cout<<"3.链表中插入数据"<<"4.删除指定数据"<<'\n';
cout<<"5.查找指定元素"<<"6.清空链表"<<'\n';
cout<<"7.遍历链表"<<'\n';
}
int main()
{
int data,n,i;
Linklist L;
linklistIntit(L);
while(1)
{
system("cls");//清屏
linklistMenu();
cin>>i;
switch(i)
{
case 1:
cout<<"请输入数量!"<<'\n';
cin>>n;
linklistheadCreat1(L,n);
break;
case 2:
cout<<"请输入数量!"<<'\n';
cin>>n;
linklistheadCreat2(L,n);
break;
case 3:
cout<<"请输入位置和新值!"<<'\n';
cin>>n>>data;
linklistInsert(L,n,data);
break;
case 4:
cout<<"请输入要删除的值!"<<'\n';
cin>>data;
linklistDelete(L,data);
break;
case 5:
cout<<"请输入要查找的值!"<<'\n';
cin>>data;
linklistLocate(L,data);
break;
case 6:
linklistClear(L);
break;
case 7:
linklistTreavle(L);
}
system("pause");//按任意键继续
}
return 0;
}