实验11-13-链表交换

该程序创建了一个单链表来存储输入的正整数序列,并实现了功能,允许用户指定两段节点范围[s1,t1]和[s2,t2]进行交换。在交换后,程序打印新链表并释放所有节点的内存。
摘要由CSDN通过智能技术生成

题目描述:

已知一个正整数序列,序列元素个数未知,但至少有两个元素,你的任务是建立一个单链表用于存储这个正整数序列。然后实现交换此链表中任意指定的两段,第一段为[s1,t1],第二段[s2,t2]。s1、t1、s2、t2代表链表的第几个节点,且满足s1<=t1,s2<=t2,t1<s2,s2一定小于等于链表节点的总个数。正整数的输入用-1作为结束标志,注意-1不算这个正整数序列中的元素(不要统计-1)。最后将链表的全部节点释放。

输入:

输入一个正整数序列,以输入“-1”结束,序列中元素个数未知,但输入“-1”前至少输入两个正整数。然后是四个整数,即为s1、t1、s2、t2

输出:

经过处理后的新链表,每个元素后有一个空格,注意最后一个元素后只有换行符。
数据最多的测试用例节点数在100这个数量级,所有整数可以用int型存储。
请注意输入输出格式。

样例输入:

1 2 3 4 5 6 7 8 9 10 -1
1 1 4 7

样例输出:

The new list is:4 5 6 7 2 3 1 8 9 10

代码段:

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
	int data;
	struct node* next;
}Node,*Link;
void insertend(Link head,int arr[],int n);
void exchange(Link head,int s1,int t1,int s2,int t2);
void printlist(Link head);
void freelist(Link head);
int main()
{
	Link head=malloc(sizeof(Node));
	head->next=NULL;
	int i=0,arr[1000];
	scanf("%d",&arr[i]);
	while(arr[i]!=-1){
		i++;
		scanf("%d",&arr[i]);
	}
	insertend(head,arr,i);
	int s1,t1,s2,t2;
	scanf("%d %d %d %d",&s1,&t1,&s2,&t2);
	exchange(head,s1,t1,s2,t2);
	printlist(head);
	return 0;
}
void insertend(Link head,int arr[],int n)
{
	Link p,q=head;
	int i=0;
	while(i<n){
		p=malloc(sizeof(Node));
		if(p!=NULL)
		{
			p->data=arr[i];
			p->next=NULL;
			q->next=p;
			q=p;
			i++;
		}
	}
}
void exchange(Link head,int s1,int t1,int s2,int t2)
{
	int i=1;
	Link a1,a2,b1,b2;
	Link p=head->next;
	Link q=head;
	while(i<s1){
		q=p;
		p=p->next;
		i++;
	}
	Link prep=q;//第一段的前驱节点
	a1=p;
	
	int j=1;
	p=head->next;
	q=head;
	while(j<t1){
		q=p;
		p=p->next;
		j++;
	} 
	Link nxtp=p->next;//第一段的后继节点
	a2=p;
	
	i=1;
	p=head->next;
	q=head;
	while(i<s2){
		q=p;
		p=p->next;
		i++;
	}
	Link preq=q;//第二段的前驱节点
	b1=p;
	
	j=1;
	p=head->next;
	q=head;
	while(j<t2){
		q=p;
		p=p->next;
		j++;
	} 
	Link nxtq=p->next;//第二段的后继节点
	b2=p;
	
	if(nxtp==b1)//如果成环,另加考虑
	{
		prep->next=b1;b2->next=a1;
		a2->next=nxtq;
	}
	else
	{
		prep->next=b1;b2->next=nxtp;
		preq->next=a1;a2->next=nxtq;	
	}
}
void printlist(Link head)
{
	Link p=head->next;
	printf("The new list is:");
	while(p!=NULL){
		if(p->next==NULL)
		{
			printf("%d\n",p->data);
			break;
		}
		else
		printf("%d ",p->data);
		p=p->next;
	}
}
void freelist(Link head)
{
	Link p=head->next;
	Link q=head;
	while(p!=NULL){
		q=p;
		p=p->next;
		free(q);
	}
	head->next=NULL;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值