题目描述:
已知一个正整数序列,序列元素个数未知,但至少有两个元素,你的任务是建立一个单链表用于存储这个正整数序列。然后实现交换此链表中任意指定的两段,第一段为[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;
}