双向链表的增删改查
doubleist.c
#include<stdio.h>
#include<stdlib.h>
#include"doublelist.h"
//先创建一个空的双向链表,头结点指向空
biList *create()
{
biList *l = malloc(sizeof(*l));
l->first = NULL;
l->last = NULL;
return l;
}
/*
功能:增加结点,保持升序
参数:头结点
*/
void insert(biList *l,biNode *p)
{
//如果双向链表不存在,返回
if(l == NULL)
{
return;
}
//如果链表为空,插入第一个位置
if(l->first == NULL)
{
l->first = p;
l->last = p;
return;
}
//如果不为空,先遍历查找
biNode *q = l->first; //用来循环
while(q)
{
if(q->data > p->data)
{
break;
}
q = q->next;
}
//分情况插入数据
if(NULL == q) //没有比p大的,p结点插在末尾
{
l->last->next = p;
p->prev = l->last;
l->next = p;
}
else
{
if(q == l->first) //第一个就比p大,插在第一个结点前
{
l->first->prev = p;
p->next = l->first;
l->first = p;
}
else
{
p->next = q;
p->prev = q->prev;
q->prev->next = p;
q->prev = p;
}
}
}
/*
功能:更改数据
参数:@l:头结点;@x:要改的数据;@y:要改为的数据
*/
void change(biList *l,element x,element y)
{
int flag = 0;
biNode *p = l->first;
while(p)
{
if(p->data == x)
{
flag = 1;
p->data == y;
}
p = p->next;
}
if(flag == 0)
{
printf("没有要改的数.\n");
}
else
{
printf("%d已改为%d\n",x,y);
}
}
/*
功能:释放双向链表所有结点
参数:头结点
*/
void delete(biList *l)
{
if(NULL == l)
{
return;
}
//1.先删除所有数据结点
//先摘除
biNode *p = l->first;
while(p)
{
l->first = p->next;
p->next = NULL;
if(l->first)
{
l->first->prev = NULL;
}
free(p);
p = l->first;
}
//删除完之后,记得让l->last指向空
l->last = NULL;
free(l);
}
/*
功能:打印所有结点
参数:头结点
*/
void printflist(biNode *l)
{
if(l == NULL||l->first == NULL)
{
return;
}
biNode *p = l->first;
printf("------------------------\n");
//正着打
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
//反着打
p = l->last;
while(p)
{
printf("%d ",p->data);
p = p->prev;
}
printf("\n");
printf("------------------------\n");
}
doublelist.h
#ifndef __DOUBLELIST_H__
#define __DOUBLELIST_H__
#define element int
//定义结点
typedef struct biNode
{
element data;
biNode *next;
biNode *prev;
}biNode;
//定义带头链表
typedef struct biList
{
biNode *first;
biNode *last;
}biList;
void insert(biList *l,biNode *p);
void change(biList *l,element x,element y);
void delete(biList *l);
void printflist(biNode *l);
#endif
main.c
#include<stdio.h>
#include<stdlib.h>
#include"doublelist.h"
int main()
{
biList *l = create();
element x;
while(1)
{
scanf("%d",&x);
if(x == 0)
{
break;
}
biNode *p = malloc(sizeof(*p));
p->data = x;
p->next = p->prev = NULL;
insert(l,p);
}
printlist(l);
change(l,2,3);
printlist(l);
delete(l);
l = NULL;
printlist(l);
return 0;
}