单链表操作的实验课

单链表的操作

① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。

② 实现该线性表的遍历。

③ 在该单链表的第i个元素前插入一个整数。

④ 删除该单链表中的第i个元素,其值通过参数将其返回。

⑤ 建立两个按值递增有序的单链表,将他们合并成一个按值递减有序的单链表。要求利用原来

//链表的建立,插入,删除 ,合并链表;
#include <stdio.h>
#include <stdlib.h>
typedef struct Link{
	int data;
	struct Link *next;
}LNode,*LinkList;

void Create_Link(LinkList &L)
{//链表的建立 
	LinkList p,cur;
	L=(LinkList)malloc(sizeof(LNode));
	int n;
	cur=L;
	printf("数据个数:"); 
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	{
		p=(LinkList)malloc(sizeof(LNode));
		scanf("%d",&p->data);
		cur->next=p;
		cur=p;
	}
	cur->next=NULL;
}

void Display_Link(LinkList L)
{//链表的遍历 
	LinkList cur;
	cur=L->next;
	while(cur)
	{
		printf("%d ",cur->data);
		cur=cur->next;
	}
	putchar('\n');
}

void Insert_Link(LinkList &L,int i,int e)
{//插入到第i个后面 
	int j=1;
	LinkList cur;
	cur=L->next;
	while(j<=i-2 && cur)
	{
		cur=cur->next;
		j++;
	}
	
	if(j!=i-1)
	{
		printf("输入位置不合法.\n");
		return ;
	}
	
	LinkList p=(LinkList)malloc(sizeof(LNode));
	p->data=e;
	p->next=cur->next;
	cur->next=p;
}

void Delete_Link(LinkList &L,int i)
{//删除第i个位置的数,并用e来返回
	LinkList s;
	LinkList cur;
	int j=1;
	cur=L->next;
	while(j<=i-2 && cur->next)
	{
		cur=cur->next;
		j++;
	}
	
	if(j!=i-1)
	{
		printf("输入位置不合法.\n");
		return ; 
	}
	
	s=cur->next;
	cur->next=s->next;
	printf("删除的数为:%d\n",s->data);
	free(s);
}

void Destroy(LinkList L)
{//销毁 
	LinkList cur,p;
	cur=L->next;
	
	while(cur)
	{
		p=cur;
		cur=cur->next;
		free(p);
	}
	
	printf("操作结束.\n");
}

void Merge(LinkList L,LinkList M,LinkList &K)
{//两个链表合并,头插
	LinkList cur1,cur2,temp;
	K=(LinkList)malloc(sizeof(LNode));
	K->next=NULL;
	cur1=L->next;
	cur2=M->next;
	
	while(cur1 && cur2)
	{
		if(cur1->data<cur2->data)
		{
			temp=cur1->next;
			cur1->next=K->next;
			K->next=cur1;
			cur1=temp;
		}
		else
		{
			temp=cur2->next;
			cur2->next=K->next;
			K->next=cur2;
			cur2=temp;
		}
	}
	
	while(cur1)
	{
		temp=cur1->next;
		cur1->next=K->next;
		K->next=cur1;
		cur1=temp;		
	}
	while(cur2)
	{
		temp=cur2->next;
		cur2->next=K->next;
		K->next=cur2;
		cur2=temp;
	}
}
int main()
{
	int i,e;
	LinkList L,M,K;
	Create_Link(L);
	Display_Link(L);
	Create_Link(M);
	Display_Link(M);
	Merge(L,M,K);
	Display_Link(K);
	
	printf("输入插入的位置和数据:");
	scanf("%d %d",&i,&e);
	Insert_Link(K,i,e);
	Display_Link(K);
	printf("输入要删除数据的位置:");
	scanf("%d",&i);
	Delete_Link(K,i);
	Destroy(K);
	
	return 0;
}

小白学习链表,但请多多指点 ,大神不喜勿喷

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值