线性表(1)单链表 完整源码
//单链表
/*
2)在递增有序单链表L上增加一个元素x,使之仍然保持有序;
3)在单链表L上查找值为x的元素,若找到,p指向值为X的结点,若没找到,p为空;
4)在递增有序单链表L上删除大于mink小于maxk的元素;
5)在有序单链表L上删除多余的相同元素
*/
#include <iostream>
#include <windows.h>
using namespace std;
typedef char ElemType; //存储的数据类型
typedef struct Lnode{ //单链表存储结构
ElemType data;
struct Lnode* next;
}LNode,*LinkList;
LinkList create_list();//头插法创建链表
LinkList create_list2();//尾插法创建链表
LinkList create_list3();//创建空链表
bool show_lq(LinkList &phead);//输出链表
bool insert_data(LinkList &phead,ElemType data,int addr);//在链表中第i 个结点之前插入新的元素;
bool delete_data(LinkList &phead,int addr);//删除单链表中第 i 个结点;
ElemType get_data(LinkList &phead,int addr);//取链表中第 i 个元素;
bool merge_linkList(LinkList &phead1,LinkList &phead2,LinkList &phead3);//归并两个有序单链表为第三个有序单链表。
bool destory(LinkList &phead);//销毁链表
bool sort_linkList(LinkList &phead);//非递减排序
bool insert_data_sort(LinkList &phead,ElemType data);//递增有序单链表L上增加一个元素x,使之仍然保持有序
int get_addr(LinkList &phead,ElemType data);// 单链表L上查找值为x的元素,若找到,p指向值为X的结点,若没找到,p为空;
bool delete_min_max(LinkList &phead,ElemType min_data,ElemType max_data);//递增有序单链表L上删除大于mink小于maxk的元素;
bool delete_to_unique(LinkList &phead);//在有序单链表L上删除多余的相同元素
void show();
void switch_channel(int channel);
LinkList phead1;
int main()
{
int channel;
do{
show();
cin>>channel;
system("cls");
switch_channel(channel);
system("pause");
}while(1);
return 0;
}
void show()
{
cout<<endl<<endl<<"\t单链表基础操作\n";
cout<<"\t1--头插法创建链表\n";
cout<<"\t2--尾插法创建链表\n";
cout<<"\t3--遍历显示链表\n";
cout<<"\t4--在特定的位置上插入数据\n";
cout<<"\t5--删除特定位置上的元素\n";
cout<<"\t6--输出特定位置上的元素\n";
cout<<"\t7--归并两个有序单链表为第三个有序单链表\n";
cout<<"\t8--非递减排序\n";
cout<<"\t9--递增有序单链表L上增加一个元素x,使之仍然保持有序\n";
cout<<"\t10--输出特定元素的位置\n";
cout<<"\t11--递增有序单链表L上删除大于mink小于maxk的元素;\n";
cout<<"\t12--有序单链表L上删除多余的相同元素\n";
cout<<"\t13--销毁单链表\n";
}
void switch_channel(int channel)
{
switch(channel)
{
case 1:
{
cout<<"头插法"<<endl;
phead1 = create_list();
show_lq(phead1);//输出链表
}break;
case 2:
{
cout<<"尾插法"<<endl;
phead1 = create_list2();
show_lq(phead1);//输出链表
}break;
case 3:
{
show_lq(phead1);
}break;
case 4:
{
int addr;
ElemType data;
cout<<"请输入插入的元素:";
cin>>data;
cout<<"请输入插入元素的位置:";
cin>>addr;
insert_data(phead1,data,addr);
show_lq(phead1);//输出链表
}break;
case 5:
{
int addr;
cout<<"请输入删除的元素位置:";
cin>>addr;
delete_data(phead1,addr);
show_lq(phead1);//输出链表
}break;
case 6:
{
int addr;
cout<<"请输入查询的元素位置:";
cin>>addr;
cout<<"此元素为:"<<get_data(phead1,addr)<<endl;
}break;
case 7:
{
LinkList phead2,phead3,phead4;
phead2 = create_list();
phead3 = create_list();
phead4 = create_list3();
merge_linkList(phead2,phead3,phead4);
}break;
case 8:
{
if(sort_linkList(phead1))
show_lq(phead1);
}break;
case 9:
{
ElemType data;
cout<<"请输入插入的元素:";
cin>>data;
show_lq(phead1);//输出链表
if(insert_data_sort(phead1,data))
cout<<"插入成功"<<endl;
show_lq(phead1);//输出链表
}break;
case 10:
{
ElemType data;
cout<<"请输入查询的元素:";
cin>>data;
show_lq(phead1);//输出链表
get_addr(phead1,data);
}break;
case 11:
{
ElemType min_data,max_data;
cout<<"请输入最小边界:";
cin>>min_data;
cout<<"请输入最大边界:";
cin>>max_data;
show_lq(phead1);//输出链表
if(delete_min_max(phead1,min_data,max_data))
show_lq(phead1);
}break;
case 12:
{
show_lq(phead1);//输出链表
if(delete_to_unique(phead1))
{
cout<<"删去后的链表为:";
show_lq(phead1);
}
}break;
case 13:
{
destory(phead1);
}break;
}
}
//头插法创建链表
LinkList create_list()
{
LinkList phead = new LNode;
if(!phead)
{
cout<<"创建失败\n"<<endl;
exit(-1);
}
phead->next = NULL;
int count = 0;
int i;
ElemType temp;
cout<<"\n请输入要创建的元素个数:";
cin>>count;
for(i = 0; i < count; i++)
{
cout<<"请输入第"<<i+1<<"个元素:";
cin>>temp;
LinkList q = new LNode;
if(!q)
{
cout<<"创建失败\n"<<endl;
exit(-1);
}
q->next = phead->next;
phead->next = q;
q->data = temp;
}
return phead;
}
//创建空链表
LinkList create_list3()
{
LinkList phead = new LNode;
if(!phead)
{
cout<<"创建失败\n"<<endl;
exit(-1);
}
phead->next = NULL;
return phead;
}
//尾插法
LinkList create_list2()
{
LinkList phead = new LNode;
LinkList p = phead;
phead->next = NULL;
int count = 0;
int i;
ElemType temp;
cout<<"\n请输入要创建的元素个数:";
cin>>count;
for(i = 0; i < count; i++)
{
cout<<"请输入第"<<i+1<<"个元素:";
cin>>temp;
LinkList q = new LNode;
if(!q)
{
cout<<"创建失败\n"<<endl;
exit(-1);
}
q->data = temp;
q->next = p->next;
p->next = q;
p = q;
}
return phead;
}
bool show_lq(LinkList &phead)
{
if(!phead)
{
cout<<"无头结点\n"<<endl;
return false;
}
LinkList p = phead->next;
cout<<"链表元素:";
while(p)
{
cout<<p->data<<" ";
p = p->next;
}
cout<<"\n";
return true;
}
//在链表中第i 个结点之前插入新的元素;
bool insert_data(LinkList &phead,ElemType data,int addr)
{
LinkList p = phead;
addr -= 1;
if(addr < 0)
{
cout<<"\n位置不合法\n";
return false;
}
int i;
for(i = 0; i < addr && p; i++)
{
p = p->next;
}
if(i > addr || !p)
{
cout<<"\n位置不合法\n";
return false;
}
LinkList q = new LNode;
q->data = data;
q->next = p->next;
p->next = q;
return true;
}
//删除单链表中第 i 个结点;
bool delete_data(LinkList &phead,int addr)
{
LinkList p = phead;
addr -= 1;
if(addr < 0)
{
cout<<"\n位置不合法\n";
return false;
}
int i;
for(i = 0; i < addr && p; i++)
{
p = p->next;
}
if(i > addr || !p)
{
cout<<"\n位置不合法\n";
return false;
}
LinkList q = p->next;
p->next = p->next->next;
delete q;
return true;
}
//取链表中第 i 个元素;
ElemType get_data(LinkList &phead,int addr)
{
LinkList p = phead;
p = p->next;
addr -= 1;
if(addr < 0)
{
cout<<"\n位置不合法\n";
return false;
}
int i;
for(i = 0; i < addr && p; i++)
{
p = p->next;
}
if(i > addr || !p)
{
cout<<"\n位置不合法\n";
return false;
}
cout<<"此位置元素为:"<<p->data<<endl;
return p->data;
}
//归并两个有序单链表为第三个有序单链表。
bool merge_linkList(LinkList &phead1,LinkList &phead2,LinkList &phead3)
{
LinkList p1 = phead1;
LinkList p2 = phead2;
LinkList p3 = phead3;
cout<<"\n链表1:";
show_lq(p1);
cout<<"\n链表2:";
show_lq(p2);
p1 = p1->next;
p2 = p2->next;
while(p1 && p2)
{
if(p1->data < p2->data)
{
p3->next = p1;
p3 = p1;
p1 = p1->next;
}
else
{
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
}
p3->next = p1 ? p1 : p2;
cout<<"\n归并为:";
show_lq(phead3);
delete phead1;
delete phead2;
return true;
}
//销毁链表
bool destory(LinkList &phead)
{
LinkList p = phead;
LinkList q;
if(!p)
{
cout<<"链表不存在"<<endl;
return false;
}
while(p)
{
q = p->next;
delete p;
p = q;
}
cout<<"销毁完成"<<endl;
return true;
}
//非递减排序
bool sort_linkList(LinkList &phead)
{
LinkList p = phead;
LinkList q = phead;
ElemType temp;
for(p = p->next; p ;p = p->next)
{
for(q = p; q ;q = q->next)
{
if(q->data < p->data)
{
temp = q->data;
q->data = p->data;
p->data = temp;
}
}
}
return true;
}
//递增有序单链表L上增加一个元素x,使之仍然保持有序
bool insert_data_sort(LinkList &phead,ElemType data)
{
sort_linkList(phead);
LinkList p = phead;
while(p->next && p->next->data < data)
{
p = p->next;
}
LinkList q = new LNode;
q->data = data;
q->next = p->next;
p->next = q;
return true;
}
// 单链表L上查找值为x的元素,若找到,p指向值为X的结点,若没找到,p为空;
int get_addr(LinkList &phead,ElemType data)
{
LinkList p = phead;
int addr = 1;
p = p->next;
while(p)
{
if(p->data == data)
{
cout<<"元素位置为:"<<addr<<endl;
return addr;
}
addr++;
p = p->next;
}
cout<<"元素不存在"<<endl;
return -1;
}
//递增有序单链表L上删除大于mink小于maxk的元素;
bool delete_min_max(LinkList &phead,ElemType min_data,ElemType max_data)
{
sort_linkList(phead);
LinkList p = phead;
LinkList q1,q2;
while(p->next && p->next->data < min_data)
{
p = p->next;
}
q1 = p;
while(p->next && p->next->data < max_data)
{
q2 = p->next;
p = q2->next;
delete q2;
}
q1->next = p->next;
return true;
}
//在有序单链表L上删除多余的相同元素
bool delete_to_unique(LinkList &phead)
{
sort_linkList(phead);
LinkList p = phead;
LinkList q;
while(p->next)
{
while(p->next->data == p->next->next->data)
{
q = p->next->next;
p->next->next = q->next;
delete q;
}
p = p->next->next;
}
return true;
}