C语言实现双向链表的交换任意结点程序实现思路

创建及初始化链表,以及打印链表,与单链表类似,采用尾插法实现。

链表自动初始化数据为L= 1 2 3 4;

要交换的结点的rear(下一个元素的地址)更改的方式与单链表方式方法一样,参考上一篇通过修改指针指向进行单链表的结点交换(C语言)

交换的结点的front的思路如下图:以交换1 4为例

 每执行完一个操作后,链表对应颜色的连接会断开,方便查找,以防止代码出现:引发了未经处理的异常:读取访问权限冲突。 p 是 nullptr。此类错误

最好通过一步一步调试去直观的看一下双链表在内存中的存储。用以加深理解。

代码实现如下:

struct node
{
	int val;
	struct node* front;
	struct node* rear;
};
typedef struct node* Ptr;

Ptr CreateList()
{
	Ptr h = (Ptr)malloc(sizeof(struct node));
	h->front = NULL;
	h->rear = NULL;
	//创建一个辅助指针
	Ptr p = h;
	int val = 1;
	while (val <= 4)
	{
		Ptr node = (Ptr)malloc(sizeof(struct node));
		node->val = val;
		node->front = p;
		node->rear = NULL;
		p->rear = node;
		p = p->rear;
		val++;
	}
	return h;
}

void Print_ByRear(Ptr L)
{
	Ptr p = L->rear;
	if (p == NULL)
		return;

	while (p)
	{
		printf("%d ", p->val);
		p = p->rear;
	}
	return ;
}

void Swap(Ptr L,int a,int b)
{
	Ptr p = L->rear, P1 = NULL, P2 = NULL,tmp1 = NULL,tmp2 = NULL;
	if (p == NULL)
	{
		printf("空表\n");
		return;
	}
	while (p != NULL)
	{
		if (p->val == a) P1 = p;
		if (p->val == b) P2 = p;
		if (P1&&P2)
			break;
		p = p->rear;
	}
	if (P1 == NULL || P2 == NULL)
	{
		printf("交换元素不存在于表中。\n");
		return;
	}
	if (P1&&P2)
	{
		//先修改rear
		P1->front->rear = P2;
		P2->front->rear = P1;
		tmp1 = P2->rear;
		P2->rear = P1->rear;
		P1->rear = tmp1;

		//再修改front
		tmp1 = P1->front;
		P1->front = P2->front;
		P2->front = tmp1;
		P2->front->front = P1;
	}
}
int main()
{
	int a = 0, b = 0;
	Ptr L = NULL;
	L = CreateList();
	printf("Before exchange:");
	Print_ByRear(L);
	printf("\n");
	printf("please scanf two element for exchange:");
	scanf("%d %d", &a, &b);
	Swap(L, a, b);
	printf("\n");
	printf("After xchange:");
	Print_ByRear(L);	
	return 0;
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言实现双向链表中插入结点并输出的代码: ```c #include <stdio.h> #include <stdlib.h> // 双向链表结构体 struct Node { int data; struct Node* prev; struct Node* next; }; // 在链表头插入结点 struct Node* insertAtBeginning(struct Node* head, int newData) { // 创建新结点 struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = newData; newNode->prev = NULL; newNode->next = head; // 如果链表不为空,修改头结点的prev指针 if (head != NULL) { head->prev = newNode; } // 返回新的头结点 return newNode; } // 在链表尾插入结点 struct Node* insertAtEnd(struct Node* head, int newData) { // 创建新结点 struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = newData; newNode->next = NULL; // 如果链表为空,新结点即为头结点 if (head == NULL) { newNode->prev = NULL; return newNode; } // 找到链表尾部结点并修改指针 struct Node* curr = head; while (curr->next != NULL) { curr = curr->next; } curr->next = newNode; newNode->prev = curr; // 返回头结点 return head; } // 输出链表 void printList(struct Node* head) { struct Node* curr = head; printf("List: "); while (curr != NULL) { printf("%d ", curr->data); curr = curr->next; } printf("\n"); } int main() { struct Node* head = NULL; // 插入结点并输出链表 head = insertAtEnd(head, 1); printList(head); head = insertAtEnd(head, 2); printList(head); head = insertAtBeginning(head, 3); printList(head); head = insertAtEnd(head, 4); printList(head); return 0; } ``` 输出结果: ``` List: 1 List: 1 2 List: 3 1 2 List: 3 1 2 4 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值