实现了双向链表的一些简单的功能 比如添加元素删除元素查找元素等
这个是.c文件
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
biLinkedList *create_bilist(void)
{
biLinkedList *bl = malloc(sizeof(*bl));
bl->first = NULL;
bl->last = NULL;
return bl;
}
biLinkedList* create_list(void)
{
//创建头
biLinkedList *bl=create_bilist();
int d;
while(1)
{
scanf("%d",&d);
if(d == 0)
{
break;
}
biNode *p = malloc(sizeof(*p));
p->data = d;
p->next=p->prev=NULL;
add_a_biNode(bl,p);
}
return bl;
}
void add_a_biNode(biLinkedList * bl, biNode * p)
{
if(bl == NULL||p == NULL)
{
return ;
}
if(bl->first == NULL)//链表为空的时候
{
p->next = p->prev = p;
bl->first = bl->last = p;
return ;
}
//1.找位置
//从first 一直找到last 停下来
int flag = 0;//PK找到与否的标记 1找到了 0没有找到
biNode*pk = bl->first;
do
{
if(pk->data>p->data)
{
flag = 1;//找到了
break;
}
pk=pk->next;
}
while (pk!=bl->first);
//2.插入
if(flag)
{
//找到的就是第一个节点比p->data大
if(pk == bl->first)//头插
{
p->next = bl->first;
bl->last->next = p;
p->prev = bl->last;
bl->first->prev = p;
bl->first = p;
}
else
{
p->next = pk;
p->prev = pk->prev;
pk->prev->next = p;
pk->prev = p;
}
}
else//尾插
{
p->next=bl->first;
p->prev=bl->last;
bl->first->prev = p;
bl->last->next = p;
bl->last = p;
}
}
/*删除x的值*/
//双向循环链表
void delete_all_x(biLinkedList*bl,ElemType x)
{
if(bl == NULL || bl->first == NULL )
{
return ;
}
biNode* pk = bl->first;
while(1)
{
int flag = 0;
do
{
if(pk->data == x)
{
flag = 1;
break;
}
pk=pk->next;
}while(pk != bl->first );
//删除
if(flag == 0)
{
return ;
}
//需要删除的是第一个元素
if(pk == bl->first)
{
//判断有几个元素
//如果只有一个元素
if(pk->next == NULL)
{
bl->first = NULL;
bl->last = NULL;
free(pk);
pk=NULL;
return ;
}
else
{
bl->last->next =pk->next;
pk->next->prev =bl->last;
bl->first=bl->first->next;
pk->next=pk->prev=NULL;
free(pk);
pk=NULL;
}
}
else
{
//如果删除的是最后一个元素
if(pk == bl->last)
{
bl->last=bl->last->prev;
bl->last->next = bl->first;
bl->first->prev = bl->last;
pk->next = pk->prev =NULL;
free(pk);
pk=NULL;
return ;
}
else
{
pk->prev->next=pk->next;
pk->next->prev=pk->prev;
pk->next = pk->prev =NULL;
free(pk);
pk=NULL;
}
}
pk=bl->first;
}
}
/*删除整个链表*/
void delete_bilist(biLinkedList* bl)
{
if(bl==NULL||bl->first==NULL)
{
return ;
}
biNode* p = bl->first;
while(1)
{
p = bl->first;
//如果只有一个
if(p->next==bl->first)
{
bl->first=bl->last=NULL;
p->next=p->prev=NULL;
free(p);
p=NULL;
break;
}
else
{
bl->first=bl->first->next;
bl->last->next=bl->first;
bl->first->prev=bl->last;
p->next=p->prev=NULL;
free(p);
p=NULL;
}
}
}
void print_list(biLinkedList* bl)
{
if(bl == NULL || bl->first == NULL)
{
return ;
}
printf("-----------------------------\n");
biNode* p = bl->first;
do
{
printf("%d ",p->data);
p = p->next;
}
while (p!=bl->first);
printf("\n");
printf("-----------------------------\n");
p = bl->last;
do
{
printf("%d ",p->data);
p = p->prev;
}
while (p!=bl->last);
printf("\n");
printf("-----------------------------\n");
}
/*以下是测试主函数*/
void main(void)
{
biLinkedList *bl = create_list();
print_list(bl);
//delete_all_x( bl, 2);
delete_bilist(bl);
free(b1);
//print_list(bl);
}
这个是.h文件
#ifndef _LIST_H_
#define _LIST_H_
typedef int ElemType;//数据元素的类型
//数据节点
typedef struct biNode
{
ElemType data;//数据域
struct biNode *next;//指向后继节点
struct biNode *prev;//指向前驱节点
}biNode;
//头结点
typedef struct biLinkedList
{
struct biNode* first;//指向双向链表的第一个节点
struct biNode* last;//指向双向链表的最后一个节点
//.....
}biLinkedList;
biLinkedList * create_bilist(void);
biLinkedList *create_list(void);
void add_a_biNode(biLinkedList*bl,biNode* p);
void print_list(biLinkedList* bl);
void delete_all_x(biLinkedList*bl,ElemType x);
void delete_bilist(biLinkedList* bl);
#endif