线性表的链式存储基本操作和链式实现线性表合并的代码

上一个博客介绍了线性表顺序存储时基本操作的实现和顺序有序表的合并,现在我们来实现线性表的链式存储。
我认为比较重要的部分就是,单链表插入数据和删除数据的实现,下面是这两个功能的图解:
在这里插入图片描述
在这里插入图片描述
所有代码:

#include<iostream>
#include<cstdlib>
using namespace std;

typedef struct LNode
{
	int data;							//结点的数据域
	struct LNode *next;						//结点的指针域
}LNode,*List;							//List为指向结构体LNode的指针类型


void InitList(List &L)						//创建链表
{
	L = (List)malloc(sizeof(LNode)); 
	L->next = NULL;
}

void ListInput(List &L,int n)				//链表数据的输入
{
//头插法 ,倒序输入 
/*	cout << "请输入各个数据:" << endl;
    for(int i=0;i<n;++i)
    {
    	List p;
	    InitList(p);
		p->next = L->next;
		L->next = p;
		cin >> p->data;
	} */
//尾插法 ,正序输入 
    cout  << "请输入各个数据:" << endl;
    List q;
	q = L;
	for(int i=0;i<n;++i)
	{
		List p;
		InitList(p);
		q->next = p;
		q = q->next;
		cin >> p->data;
	} 
}

bool LocateElem(List L,int e)				//判断List里有没有e这个元素
{
	while(L->next!=NULL)
	{
		L = L->next;
		if(L->data==e)
		   return true;
	}
	return false;
}

void ListInsert(List &L,int e)				//将e插入到List中
{
	int i=0,n;
	cout << "请输入要插入的位置:" << endl;
	cin >> n; 
	List p,s;
	InitList(p);
	InitList(s);
	p = L;
    while(L&&i<n-1)
    {
    	p = p->next;
	}
	if(!L||i>n-1)
	{
		cout << "插入失败!" << endl;
	}
	else
	{
		s->data = e;
     	s->next = p->next;
     	p->next = s;
	}
}

void delete_e(List &L,int i)  //链表第i个元素的删除 
{
	List p,q;
	p = L;
    int j=0;
    while(p->next&&j<i-1)
    {
    	p = p->next;
    	++j;
	}
	q = p->next;
	p->next = q->next;
	free(q);
}

void ListOutput(List L)						//输出List
{
	while(L->next!=NULL)
	{
	    L = L->next;
		cout << L->data << " ";
	}
	cout << endl;
}

void deleteList(List &L) //链表的销毁 
{
	List p;
	p = L;
	while(p)
	{
		L= L->next;
		free(p);
		p = L;	
	}
	cout << "销毁成功!" << endl; 
} 

void unionList(List &LA,List LB)					//算法2.14 线性表的合并(链表)
{
   	//将所有在线性表LB中但不在LA中的数据元素插入到LA中
   	List pa, pb, p ,q;
   	p = LA;
    pa = LA->next;
    pb = LB->next;
    while(pa&&pb)
    {
    	if(pa->data > pb->data)
    	{
		    q = pb;
		    pb = pb->next;
    		p->next = q;
    		p = q;
    		q->next = pa;
		}
		else
		{
			p = pa;
			pa = pa->next;
		}
	}
	while(pa&&!pb)//如果pb为空 
	{
		p->next = pa;
		p = p->next;
		pa = pa->next;
	}
	while(!pa&&pb)//如果pa为空 
	{
		q = pb;
		p->next = q;
		pb = pb->next;
		p = q;
	}
	cout << "合并完毕!" << endl;  
}													//unionList

int main()
{
	List LA,LB,L;
	int n,m,L_n,choose,e,x=0,i;
	

	cout << "1.数据链表的创建" << endl;
	cout << "2.数据的输入" << endl;
	cout << "3.判断数据e是否存在" << endl;
	cout << "4.插入数据e" << endl;
	cout << "5.删除链表第i个元素" << endl;
	cout << "6.两个数据链表的合并" <<endl;
	cout << "7.数据链表的输出" << endl; 
	cout << "8.数据链表的销毁,并退出程序" << endl;
	
	
	while(x==0)
	{
	    cout << "请选择:";
	    cin >> choose;
		switch(choose)
	    {
		case 1:
			InitList(L);
			cout << "创建成功!" << endl; 
			break;
		case 2:
			cout << "请输入线性表元素的个数:";
			cin >> L_n;
			ListInput(L,L_n);
			cout << "输入成功!" << endl;
			break;
		case 3:
			cout << "请输入要查询的数据e:";
			cin >> e;
			if(LocateElem(L,e))
			   cout << "线性表L中存在数据" << e << endl; 
			else
			   cout << "线性表L中不存在数据" << e << endl;
			break;
		case 4:
			cout << "请输入要插入的数据:";
			cin >> e;
			ListInsert(L,e);  
			break;
		case 5:
			cout << "请输入i的值" << endl;
			cin >> i; 
			delete_e(L,i);
			break;
		case 6:
	     	InitList(LA);
	        InitList(LB);
			cout<<"请输入线性表LA的元素个数:";
			cin>>n;
			ListInput(LA,n);
			cout<<"请输入线性表LB的元素个数:";
			cin>>m;
			ListInput(LB,m);
			
			unionList(LA,LB);
		
			cout<<"LA和LB合并后的集合为:\n";
			ListOutput(LA);
			break;
			case 7:
				ListOutput(L);
			break;
	        case 8:
	        	deleteList(L);
	        	x = 1;
	        break;
			} 
	}
	return 0;
}
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值