编写一个算法来交换单链表中的第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;
}
**运行结果**
大家有什么问题可以私信我哦!