-->
当前位置:首页 > 题库 > 正文内容

函数题:LinkList5-交换单链表第n和n+1个链点【有题解视频】

Luz3年前 (2022-03-24)题库936
带头结点的单链表,头指针为h,编写算法SwapN_inList( ),实现单链表中第n个结点和第n+1个结点相互交换,如果n为尾结点,需要向用户输出提示信息,代表交换失败,返回0,若交换成功返回1,并打印交换后的单链表。

带头结点的单链表结点定义如下:
c
typedef int DataType;
typedef struct Node
{
DataType data; // data域用于存储数据元素
struct Node *next; // next域用于存放指向其后继的指针
}LNode, *PNode, *LinkList; // LinkList为头指针

### 函数接口定义:
c
int SwapN_inList( LinkList a , int posN , int *len);

其中 a ,posN , *len都是用户传入的参数。 a是单链表的头指针,posN代表需要进行交换的链点位置,*len是在遍历A链表时顺便记录A链表的长度。
### 裁判测试程序样例:
c
#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
typedef struct Node
{ DataType data;
struct Node *next;
}LNode, *PNode, *LinkList;
int InitLinkList(LinkList *head)
{
*head = (LinkList)malloc(sizeof(LNode));
if (!head)
{
printf("初始化链表错误!\n");
return 0;
}
(*head)->next = NULL;
return 1;
}
int LinkListLength(LinkList head)
{
int length = 0;
PNode p = head->next;
while (p)
{
length++;
p = p->next;
}
return length;
}
int LinkListEmpty(LinkList head){
if (head->next) {
return 0;
}
else {
return 1;
}
}
int LinkListInsert(LinkList h, int pos, DataType x)
{
PNode p = h, q;
int i = 0;
while (p && i < pos- 1)
{
p = p->next;
i++;
}
if (!p || i > pos - 1)
{
printf("插入位置不合法!\n");
return 0;
}
q = (PNode)malloc(sizeof(LNode));
if (!q)
{
printf("不能生成新结点\n");
return 0;
}
q->data = x;
q->next = p->next;
p->next = q;
return 1;
}
void DestroyLinkList(LinkList h)
{
PNode p = h->next;
while (h)
{
p = h;
h = h->next;
free(p);
}
}
void TraverseLinkList(LinkList h)
{
PNode p = h->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
PNode findN(LinkList a,int n)
{
int cnt = 1;
PNode p = a;
while( p && cnt++ <= n )
p = p->next;
return p;
}
int main()
{
LinkList h;
char ch;
PNode s1=NULL,s2=NULL,s3=NULL,s4=NULL;
DataType x,N;
int length = 0, pos = 1;
InitLinkList(&h);
do
{
scanf("%d",&x);
LinkListInsert( h , pos++ , x );
}while((ch=getchar())!='\n');
scanf("%d",&N);
s1 = findN(h,N);
if (s1)
{
s2 = s1->next;
}
if ( SwapN_inList( h , N , &length) == 1 )
{
s3 = findN(h,N);
if (s3)
{
s4 = findN(h,N+1);
}
if ( s1 == s4 && s2 == s3 )
{
printf("交换第%d个和第%d个链点位置后的单链表A是\n", N , N+1 );
TraverseLinkList( h );
}
}
else
{
printf("单链表A的第%d个结点为尾结点,没有下一个结点与之交换\n", length);
}
DestroyLinkList( h );
return 0;
}
/* 请在这里填写答案 */


### 输入样例:
in
1 2 3 4 5 6 7 8 9
6



### 输出样例:
out
交换第6个和第7个链点位置后的单链表A是
1 2 3 4 5 7 6 8 9







答案:若无答案欢迎评论

#写在前面的话#

*提供题解视频,是为了帮助大家掌握算法的思想,在今后的编程、考试、面试中,换了语言,换了编译器,换了开发平台,都能重现这种思想,从而编写出任意语言任意编译器任意开发平台下面的这种算法的代码来,所以对于一打开题解报告,就直接拖到视频最后看参考代码的做法,我们非常不赞同,也不符合我们制作PPT录制讲解视频的初衷,希望大家体谅我们的苦心。*

https://www.bilibili.com/video/BV1D3411W7yW/
![LinkList5.png](~/bd6c34ea-452e-4b75-ae99-d0514ee6ea41.png)

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。