数据结构》严奶奶版本---线性表(1)单链表 完整源码

线性表(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;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值