// 带头节点的双链表
#include<stdio.h>
#include<stdlib.h>
typedef struct DNode
{
int data;
struct DNode *prior;
struct DNode *next;
}DNode;
// 初始化头结点
DNode *Init_DLinkList()
{
DNode* L;
L=(DNode*)malloc(sizeof(DNode));
L->data=0;
L->prior=NULL; //头置零
L->next=NULL; //尾置零,暂时还没后续结点
}
//打印列表的函数
void Print_List(DNode* p)
{
DNode* node = p->next;
while (node)
{
printf("%d ",node->data);
node=node->next;
}
}
//双链表的建立
void Bulid_DLinkList(DNode* p)
{
int data;
scanf("%d",&data);//输入要存储的数据
DNode *s,*r;
r=p;
while (data!=999)
{
s=(DNode*)malloc(sizeof(DNode));//开辟一个新的结点
s->data=data;
s->next=NULL;//(NULL)
s->prior=p;
p->next=s;
p=s;
scanf("%d",&data);
}
}
//双链表的插入
int Insert_List(DNode* p,int i,int data)//在双链表的第i个元素插入data
{
DNode* s=(DNode*)malloc(sizeof(DNode));//待插入的结点
DNode* q;
q=p;//先将头结点的地址保存。
for(int j=0;((j<i-1)&&(q->next!=NULL));j++)//循环找到第i-1个结点
{
q=q->next;
}
if((i==0)) //不满足条件
{
return 0;
}
else
{
s->data=data;
s->next=q->next;//将s的后继指向原来的i节点
q->next=s;
s->prior=q;
s=q;
}
}
//双链表的删除
void Delete_List(DNode* p,int i)//将第i个结点删除
{
DNode* q;
q=p;
for(int j=0;j<i-1;j++)
{
q=q->next;
}
DNode* s;//零时保存要删除的结点
s=q->next;
q->next=s->next;
s->next->prior=q;
free(s);
}
int main()
{
DNode* L=Init_DLinkList();
Bulid_DLinkList(L);
Insert_List(L,1,50);
Delete_List(L,3);
Print_List(L);
return 0;
}
标签:结点,实现,List,next,链表,int,双向,data,DNode
From: https://www.cnblogs.com/lzzcforever/p/17573449.html