双向链表
List.h文件
#ifndef _LIST_H_
#define _LIST_H_
typedef enum{TRUE,FLAST,ERROR}BOOL;
typedef int Data;
typedef struct _node
{
Data data;
struct _node *pre;
struct _node *next;
}Node;
typedef struct _list
{
Node *head;
}List;
//创建链表
List *CreateList();
//销毁链表
void Destroy(List *pa);
//头插结点
BOOL Insert_Head(List *pa,Data data);
//尾插结点
BOOL Insert_Last(List *pa,Data data);
//特殊位置插入结点
BOOL Insert_Pos(List *pa,int pos,Data data);
//删除某位置的结点
BOOL Detele(List *pa,int pos);
//按内容删除结点
BOOL Detele_Data(List *pa,Data data);
//链表逆序
void Reverse(List *pa);
//打印函数
void Display(List *pa);
#endif// _LIST_H_
List.c文件
#include "List.h"
#include <stdlib.h>
#include <stdio.h>
List *CreateList()
{
List *pa=(List *)malloc(sizeof(List)/sizeof(char) );
if(NULL==pa)
return NULL;
pa->head=(Node *)malloc(sizeof(Node)/sizeof(char) );
if(NULL==pa->head)
{
free(pa);
return NULL;
}
pa->head->next=NULL;
return pa;
}
BOOL Insert_Head(List *pa,Data data)
{
Node *node=(Node *)malloc(sizeof(Node)/sizeof(char) );
if(NULL==node)
return ERROR;
node->data=data;
node->next=pa->head->next;
pa->head->next=node;
node->pre=pa->head;
if(node->next!=NULL)
{
node->next->pre=node;
}
return TRUE;
}
BOOL Insert_Last(List *pa,Data data)
{
Node *node=(Node *)malloc(sizeof(Node)/sizeof(char) );
if(NULL==node)
return ERROR;
node->data=data;
node->next=NULL;
Node *temp=pa->head;
while(temp->next)
{
temp=temp->next;
}
temp->next=node;
node->pre=temp;
}
BOOL Insert_Pos(List *pa,int pos,Data data)
{
if(NULL==pa||pos<0)
return ERROR;
Node *temp=pa->head;
int i;
for(i=0;i<pos-1;i++)
{
temp=temp->next;
if(temp==NULL)
{
printf("你已越界%d\n",pos);
return ERROR;
}
}
Node *node=(Node *)malloc(sizeof(Node)/sizeof(char) );
if(NULL==node)
return ERROR;
node->data=data;
node->next=temp->next;
temp->next=node;
node->pre=temp;
if(temp->next!=NULL)
{
temp->next->pre=node;
}
return TRUE;
}
BOOL Detele(List *pa,int pos)
{
if(NULL==pa)
return ERROR;
Node *temp=pa->head;
int i;
for(i=0;i<pos-1;i++)
{
temp=temp->next;
if(temp==NULL||temp->next==NULL)
{
printf("你已越界%d\n",pos);
return ERROR;
}
}
Node *p=temp->next;
temp->next=p->next;
if(p->next!=NULL)
{
p->next->pre=temp;
}
free(p);
return TRUE;
}
BOOL Detele_Data(List *pa,Data data)
{
if(NULL==pa)
return ERROR;
Node *temp=pa->head;
while(temp->next)
{
if(temp->next->data==data)
{
Node *p=temp->next;
temp->next=p->next;
if(p->next!=NULL)
{
p->next->pre=temp;
}
free(p);
return FLAST;
}
temp=temp->next;
}
return TRUE;
}
void Reverse(List *pa)
{
if(NULL==pa||NULL==pa->head
||NULL==pa->head->next||NULL==pa->head->next->next)
return ;
Node *cur=pa->head->next;
Node *temp;
while(cur->next!=NULL)
{
temp=cur->next;
cur->next=cur->pre;
cur->pre=temp;
cur=temp;
}
pa->head->next->next=NULL;
cur->next=cur->pre;
pa->head->next=cur;
}
void Display(List *pa)
{
if(NULL==pa)
return ;
Node *temp=pa->head->next;
while(temp)
{
printf("%-4d",temp->data);
temp=temp->next;
}
printf("\n");
}
void Destroy(List *pa)
{
if(NULL==pa)
return;
Node *temp=pa->head;
while(temp->next)
{
Node *p=temp->next;
temp->next=p->next;
free(p);
}
free(pa->head);
free(pa);
}