本关任务:
1.完成创建双向链表;
2.在双向链表中指定位置插入数据元素;
3.删除双向链表中满足条件的结点
4.回收双向链表占用的空间。
定义结点类型
struct node
{//链表结点类型,包含一个存放整型数据的 data 成员,和指向前驱和后继结点的指针
int data ;
struct node *llink, *rlink ;
};
struct Hnode
{
//双向链表头结点,有两个指针成员,分别指向双向链表的第一个结点和最后一个结点
struct node *head, *tail;
};
创建带头结点的双向链表
struct Hnode *createDlist()
{//函数功能:创建一个带头结点的双向链表,tail指向尾结点;head指针指向第一个结点,返回值是指向头结点的指针
struct Hnode* head = malloc(sizeof(struct Hnode));
//if (head == NULL)return;
head->head = head;
head->tail = NULL;
return head;
}
头插法
void insertDlist(struct Hnode *list, int insData)
{
//在双向链表的表头插入数据
struct node* p = malloc(sizeof(struct node));
if (p == NULL)return;
else
{
if (list->tail==NULL)
{
p->data = insData;
p->llink = list;
list->tail = p;
p->rlink = NULL;
}
else
{
p->data = insData;
list->tail->llink = p;
p->rlink = list->tail;
list->tail = p;
p->llink = list;
}
}
}
删除结点
int deleteData(struct Hnode *list, int delData)
{
//在双向链表中删除值为delData的第一个结点,若删除成功返回1,否则返回0
struct node* p = list->tail;
struct node* q = list;
if (p->data == delData)
{
list->tail = p->rlink;
p->rlink->llink = list;
return 1;
}
p = p->rlink;
q = p;
while (p)
{
if (p->data == delData)
{
q->rlink= p->rlink;
p->rlink->llink = p->llink;
return 1;
}
else
{
p = p->rlink;
q = q->rlink;
}
}
return 0;
}
遍历
void printDlist(struct Hnode *list)
{
//输出双向循环链表中各数据元素的值,每输出一个数据元素换行
struct node* p = list->tail;
while (p)
{
printf("%d\n", p->data);
p = p->rlink;
}
}
销毁链表
int destroyDlist(struct Hnode *list)
{//释放双向链表占用的存储空间,释放所有结点,返回释放的结点数,不含list本身
int count=0;
struct node* p = list->tail;
struct node* q = list;
list = p;
free(q);
while (list)
{
p = list;
count++;
list = p->rlink;
free(p);
}
return count;
}
主函数
int main()
{
struct Hnode *head = createDlist();
int num , data;
scanf("%d",&num);
for(int i=0;i<num;i++)
{
scanf("%d",&data);
insertDlist(head, data);
}
printDlist(head);
scanf("%d",&data);
printf("\n%d ",deleteData(head,data));
printf("\n%d ",destroyDlist(head));
return 1;
}