单向线性链表的建立,删除及查询,合并

链表的建立,插入,删除,即有序合并:

结构体的定义
#include<iostream>
//#include<cstdlib>
#define OK 0//0代表正常退出 
#define ERROR -1 //-1代表发生了错误。 

using namespace std;

typedef struct LNode{
	int date;
	struct LNode *next;
 }LNode,*LinkList;
头插法建立链表

思路
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

void CreatList(LinkList &L ){//建立链表,插入到链表的头部,也就是常说的头插法 
	printf("请输入你创建链表的大小:");
	int N;
	scanf("%d",&N); 
	L=(LinkList)malloc(sizeof(LNode));//调用Malloc函数为头节点分配内存 
	L->next=NULL;//建立一个带头结点的单链表 
	for(int i=N; i>0; --i){
		LinkList p=(LinkList)malloc(sizeof(LNode)); 
		int temp;//用于接收数据
		printf("请输入数据:");  
		scanf("%d",&temp);
		p->date=temp;
		p->next=L->next;
		L->next=p;
	}
}
尾插法建立链表

思路
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

void CreatList(LinkList &L,string name)//建立链表,name为链表的名字方便区分,以下雷同。 
{
	cout<<"请输入你创建"<<name<<"链表的大小:";
	int N;
	cin>>N;
	LinkList p,q; 
	L=p=(LinkList)malloc(sizeof(LNode));//调用Malloc函数为头节点分配内存 
	p->next=NULL;//建立一个带头结点的单链表 
	for(int i=0; i<N; i++)//尾插法 
	{
		q=(LinkList)malloc(sizeof(LNode)); 
		int temp;//用于接收数据
		cout<<"请输入数据:";  
		cin>>q->date;
		p->next=q;
		p=q;
	} 
	p->next=NULL;//q->next=NULL;也是可以的 
}

以下代码比较简单

int ListInsert(LinkList &L,string name)
{
	cout<<"当前被操作的时链表:"<<name<<endl; 
	cout<<"请输入你要插入元素的位置:";
	int i;
	cin>>i;
	cout<<"请输入你要插入元素位置的值:";
	int E; 
	cin>>E; 
	LinkList p=L;
	int j=0;
	while(p&&j<i-1)//寻找第i-1个节点 
	{
		p=p->next;
		++j;
	}
	if(!p || j>i-1)//i<1或大于表长+1: 
	{
		cout<<"插入位置无效!"<<endl;
		return ERROR;
	}
	LinkList s=(LinkList)malloc(sizeof(LNode));
	s->date=E;
	s->next=p->next;
	p->next=s;
	return 0;
}
int DeleteList(LinkList &L,string name)
{
	cout<<"当前被操作的时链表:"<<name<<endl;
	cout<<"请输入你要删除元素的位置:";
	int i;
	cin>>i;
	LinkList p=L;
	int j=0;
	while(p->next&&j<i-1)
	{
		p=p->next;
		++j;
	}
	if(!(p->next) || j>i-1)
	{ 
	   cout<<"删除位置无效!"<<endl; 
	   return ERROR;
	} 
	LinkList q=p->next;
	p->next=q->next;
	free(q);
	return 0;
}
 int GetElem(LinkList L,int i,int &E)//查看节点 
{
 	LinkList p=L->next;
 	int j=1;
 	while(p&&j>i){
 		p=p->next;
 		++j;
	}
	if(!p || j>i)
	{
		cout<<"访问失败"; 
		return ERROR;
	}
	E=p->date;
	return 0;
}
void MergeList(LinkList &L1,LinkList &L2,LinkList &L3)
{
	LinkList p1=L1->next;
	LinkList p2=L2->next;
	LinkList p3=L3;
	while(p1&&p2)
	{
		if(p1->date<=p2->date)
		{
			p3->next=p1;
			p3=p1;
			p1=p1->next;
		}
		else
		{
			p3->next=p2;
			p3=p2;
			p2=p2->next;
		}
	}
	p3->next=p1?p1:p2;
	free(L2);
	cout<<"合并成功!"; 
}
 int PrintList(LinkList L,string name)
{
	LinkList p=L;
	cout<<"链表"<<name<<"中的元素为:"; 
	while(p->next)
	{
		p=p->next;
		cout<<p->date<<"  ";
	 }
	 cout<<endl;
	 return 0; 
} 
int main()
{
	LinkList head1,head2,head3;
	CreatList(head1,"head1");
	PrintList(head1,"head1");
	ListInsert(head1,"head1");
	PrintList(head1,"head1");
	CreatList(head2,"head2");
	PrintList(head2,"head2");
	DeleteList(head2,"head2");
	PrintList(head2,"head2");
	CreatList(head3,"head3");
	PrintList(head3,"head3");
	MergeList(head1,head2,head3);
	PrintList(head3,"head3");
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值