C语言算法基础——双向链表的实现代码

文章目录

  • 一、双向链表的实现思路
  • 二、代码示例
  • 三、结果展示


一、双向链表的实现思路

双向链表与单向链表,只多了一个前驱节点,实现时只需要多考虑一下前驱指针的指向即可

二、代码示例

#include
#include
#include
//双向链表的结构体
typedef struct node 
{
	int data;//数据域
	struct node *perv;//前驱节点指针
	struct node *next;//后继节点指针
}Node;
//链表初始化
Node *init()
{
	Node *head=(Node *)malloc(sizeof(struct node));//头节点申请地址
	head->perv=NULL;
	head->next=NULL;
	head->data=0;
	return head;
}
//插入新节点
int insert_node(Node *head,int pos,int val)
{
	Node *h=head;
	Node *p=(Node *)malloc(sizeof(struct node));//给新节点分配地址
	p->data=val;
	int i;
	for(i=0;i<pos-1;i++)//循环到插入位置的前驱节点
		h=h->next;
	p->next=h->next;//新节点的后继指针等于前驱节点的后继指针
	p->perv=h;//新节点的前驱指针指向前驱节点
	if(h->next!=NULL)//如果初始前驱节点有后继节点
		h->next->perv=p;//后继节点的前驱指针指向新节点
	h->next=p;//前驱节点的后继指针指向新节点
	printf("在第%d位插入%d\n",pos,val);
	return 1;
}
//删除节点
int del_node(Node *head,int pos)
{
	
	Node *h=head;
	Node *q;
	int i;
	for(i=0;i<pos-1;i++)//道理与插入类似,可以自己思考一下
		h=h->next;
	q=h->next;
	h->next->perv=NULL;
	if(q->next!=NULL)
	{
		q->next->perv=h;	
	}
	h->next=q->next;
	free(q);//释放删除节点的空间
	printf("删除第%d位节点\n",pos);
	return 1;
}
//输出整个链表
void printf_all(Node *head)
{
	while(head->next!=NULL)//链表末尾节点的后继指针为空
	{
		head=head->next;
		printf("%-5d",head->data);
	}
	printf("\n");
}
int main()
{
	//测试
	Node *head=init();
	insert_node(head,1,1);
	printf_all(head);
	insert_node(head,1,2);
	printf_all(head);
	insert_node(head,1,3);
	printf_all(head);
	del_node(head,1);
	printf_all(head);
}

三、结果展示

C语言算法基础——双向链表的实现代码_第1张图片

你可能感兴趣的:(C语言初级算法的实现,链表,算法,c语言)