C语言实现双链表

和单链表类似,双链表也由头指针head唯一确定,增加头结点也能使双链表上的某些运算变得方便,将头结点和尾结点链接起来也能构成循环链表。双链表结构是一种对称结构,既有前向链又有后向链,这使得插入和删除操作都很方便。

#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct dnode
{
	datatype data;
	struct dnode *prior,*next;
}dlinklist;
/*创建双链表*/
dlinklist *CreateList(){
	char ch;
	dlinklist *head,*temp,*rear;
	head = (dlinklist*)malloc(sizeof(dlinklist));
	rear = head;
	rear->prior = head;
	ch = getchar();
	while (ch != '$')
	{
		temp = (dlinklist*)malloc(sizeof(dlinklist));
		temp ->data = ch;
		temp ->prior = rear;
		rear ->next = temp;
		rear = temp;
		ch = getchar();
	}
	rear->next = NULL;
	return head;
}
/*双链表的前插操作,在带头结点的双链表中,将值为x的新结点插入*p之前*/
void DIsertBefore(dlinklist *p,datatype x){
	dlinklist *temp;
	temp = (dlinklist*)malloc(sizeof(dlinklist));
	temp ->data = x;
	temp->prior = p->prior;
	temp->next = p;
	p->prior->next = temp;
	p->prior = temp;
}

/*双链表上删除自身的操作*/
void DeleteNode(dlinklist *p){
	p->prior->next = p->next;
	p->next->prior = p->prior;
	free(p);
}


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言实现双链表反转的代码: ``` #include <stdio.h> #include <stdlib.h> // 双链表节点结构体 typedef struct ListNode { int val; struct ListNode* next; struct ListNode* prev; } ListNode; // 反转双链表函数 ListNode* reverseList(ListNode* head) { ListNode* prev = NULL; ListNode* curr = head; while (curr != NULL) { ListNode* next = curr->next; curr->next = prev; curr->prev = next; prev = curr; curr = next; } return prev; } // 打印双链表函数 void printList(ListNode* head) { while (head != NULL) { printf("%d ", head->val); head = head->next; } printf("\n"); } int main() { // 创建双链表 ListNode* node1 = (ListNode*)malloc(sizeof(ListNode)); node1->val = 1; ListNode* node2 = (ListNode*)malloc(sizeof(ListNode)); node2->val = 2; ListNode* node3 = (ListNode*)malloc(sizeof(ListNode)); node3->val = 3; ListNode* node4 = (ListNode*)malloc(sizeof(ListNode)); node4->val = 4; node1->next = node2; node2->prev = node1; node2->next = node3; node3->prev = node2; node3->next = node4; node4->prev = node3; node4->next = NULL; // 打印原始双链表 printf("Original List: "); printList(node1); // 反转双链表 ListNode* newHead = reverseList(node1); // 打印反转后的双链表 printf("Reversed List: "); printList(newHead); return 0; } ``` 代码解析: 1. 定义了一个双链表节点结构体,包括节点值、下一个节点指针和上一个节点指针。 2. 定义了一个反转双链表的函数,参数为头节点指针,返回值为反转后的头节点指针。 3. 在反转双链表函数中,定义了三个指针变量,分别代表前一个节点、当前节点和下一个节点。初始时,前一个节点为NULL,当前节点为头节点。 4. 使用while循环遍历整个双链表,每次迭代时,先将当前节点的下一个节点保存到next指针中,然后将当前节点的next指针指向前一个节点,将prev指针指向next节点,更新前一个节点为当前节点,当前节点为next节点。 5. 最后返回前一个节点,即为反转后的头节点。 6. 定义了一个打印双链表的函数,参数为头节点指针,直接遍历整个链表,打印每个节点的值。 7. 在main函数中,创建了一个包含4个节点的双链表,并打印原始链表。 8. 调用反转双链表函数,得到反转后的链表头节点指针,并打印反转后的链表。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值