C语言——数据结构——编写一个算法来交换带头节点的单链表中的第num个节点与其后继节点(详细过程)

编写一个算法来交换单链表中的第num个节点与其后继节点,Head是该链表中的头指针 节点后面为空则不交换

定义结构体

#include <stdio.h>	//printf
#include <stdlib.h> //malloc
#include <string.h> //strlen

#define BUF_MAXLEN 1024
typedef int Elemtype; //数据元素的类型
//数据节点
typedef struct node
{
	Elemtype data;	   //数据域:保存数据本身用的
	struct node *next; //指针域:用来保存关系用的,保存下一个数据节点的地址
}Node;

typedef struct head
{
	Elemtype num; //数据域:保存数据本身用的
	struct node *first; //头指针

	struct node *last; //尾指针
} Head;

/*
	Exchange_NumNode:交换单链表中的第num个节点与其后继节点,Head是该链表中的头指针
*/
int Exchange_NumNode(Head *head, int num)
{
	//判断num的合法性
	if(num >= head->num || num <= 0)
	{
		printf("Num非法!\n");
		return -1;
	}
	
	Node *pre = NULL;
	Node *p = head->first;
	//找到第num-1号节点和第num号节点
	while(--num)
	{
		pre = p;
		p = p->next;
	}

	//p指向第num号节点,pre指向第num-1号节点
	//分情况替换
	if(head->num == 2)//只有两个节点
	{
		head->first = p->next;
		p->next = head->first->next;
		head->first->next = p;
		head->last = p;
	}
	else if(p == head->first)//要替换位置的是首节点和后面那个节点
	{
		head->first = p->next;
		p->next = head->first->next;
		head->first->next = p;
	}
	else if(p->next == head->last)//要替换位置的是倒数第二个节点和尾节点
	{
		pre->next = p->next;
		p->next = p->next->next;
		pre->next->next = p;
		head->last = p;
	}
	else//要替换位置的是中间节点和后面那个节点
	{
		pre->next = p->next;
		p->next = p->next->next;
		pre->next->next = p;
	}
}

/*

	Print_Lisklist:将一条单链表打印出来

		@list	: 要打印的链表

*/
void Print_Linklist_Head(Head *head)
{
	Node *p = head->first;
	printf("此链表中有%d个节点:\n", head->num);
	// printf("链表节点地址:%p\n头节点的first:%p\n尾节点的last:%p\n节点数:%d\n ", head, head->first,head->last,head->num);
	while (p)
	{
		printf("%d ", p->data);
		p = p->next;
	}

	putchar('\n');
}

int main()
{
	//编写一个算法来交换单链表中的第num个节点与其后继节点,Head是该链表中的头指针 节点后面为空则不交换
	//创建带头节点的单链表的函数上一篇有详细代码,可以参考
	Head *head = Create_Linklist_Head();
	Print_Linklist_Head(head);
	int num;
	printf("请输入要交换第几号节点:\n");
	scanf("%d",&num);

	Exchange_NumNode(head,num);

	Print_Linklist_Head(head);
	return 0;
}

**运行结果**

在这里插入图片描述

大家有什么问题可以私信我哦!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值