双向链表的图示
在链表中,为方便访问结点的前驱,对链表进行扩充,增加前驱指针,形成双向链表。
1.增加双向链表头结点,里面有两个指针成员,分别指向双向链表的第一个结点和最后一个结点。
2.再创建一个存放数据,指向前驱和指向后驱的结点。
双向链表的代码
双向链表头节点
struct Hnode
{
//双向链表头结点,有两个指针成员,分别指向双向链表的第一个结点和最后一个结点
struct node *head, *tail;
};
链表结点类型
struct node
{//链表结点类型,包含存放整型数据的 data 成员,和指向前驱和后继结点的指针
int data ;
struct node *llink, *rlink ;
};
创建一个带头结点的双向链表
struct Hnode *createDlist()
{//函数功能:创建一个带头结点的双向链表,tail指向尾结点;head指针指向第一个结点,返回值是指向头结点的指针
struct node *list;
struct Hnode *temp;
temp=(struct Hnode*)malloc(sizeof(struct Hnode));
list=(struct node*)malloc(sizeof(struct node));
list->data=0;
list->llink=list->rlink=NULL;
temp->head=temp->tail=list;
return temp;
}
在双向链表的表头插入数据
void insertDlist(struct Hnode *list, int insData)
{
//在双向链表的表头插入数据
struct node *temp;
temp=(struct node*)malloc(sizeof(struct node));
temp->data=insData;
temp->llink=NULL;
temp->rlink=list->head;
list->head->llink=temp;
list->head=temp;
return;
}
删除结点
int deleteData(struct Hnode *list, int delData)
{
//在双向链表中删除值为delData的第一个结点,若删除成功返回1,否则返回0
struct node *p;
p=(struct node*)malloc(sizeof(struct node));
for(p=list->head;p->rlink!=NULL;p=p->rlink)
{
if(p->data==delData)
{
if(p==list->head)
{
p->rlink->llink=NULL;
list->head=p->rlink;
}
else if(p==list->tail)
{
p->llink->rlink=NULL;
list->tail=p->llink;
}
else
{
p->llink->rlink=p->rlink;
p->rlink->llink=p->llink;
}
free(p);
return 1;
}
}
return 0;
}
输出双向链表的值
void printDlist(struct Hnode *list)
{
//输出双向循环链表中各数据元素的值,每输出一个数据元素空一格
struct node *p;
p=(struct node*)malloc(sizeof(struct node));
for(p=list->head;p->rlink!=NULL;p=p->rlink)
{
printf("%d ",p->data);
}
return;
}
回收双向链表占用的空间
int destroyDlist(struct Hnode *list)
{//释放双向链表占用的存储空间,释放所有结点,返回释放的结点数,不含list本身
int count=0;
struct node *p,*temp;
temp=p=(struct node*)malloc(sizeof(struct node));
for(p=list->head;p->rlink!=NULL;p=p->rlink)
{
temp=p;
free(temp);
count++;
}
return count;
}
主函数
#include <stdio.h>
#include <stdlib.h>
int main()
{
struct Hnode *head = createDlist();
int num , data;
printf("请输入元素的个数:\n");
scanf("%d",&num);
printf("请输入各个元素的数值:\n");
for(int i=0;i<num;i++)
{
scanf("%d",&data);
insertDlist(head, data);
}
printf("该双向链表如下:\n");
printDlist(head);
printf("请输入要删除的元素的值:\n");
scanf("%d",&data);
printf("删除成功则输出1,否则输出0\n");
printf("%d ",deleteData(head,data));
printf("回收空间时删除的元素个数:%d\n",destroyDlist(head));
return 0;
}