创建一个工程
在Header files中 创建两个文件
1.status.h
#ifndef STATUS_H
#define STATUS_H
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status是函数的类型,其值是函数结果状态代码
typedef int Status;
typedef int ElemType;
#endif
2.创建DulinkList.h
#ifndef DULLINKLIST_H
#define DULLINKLIST_H
#include "status.h"
typedef struct DuLNode{
ElemType data;//数据域
struct DuLNode *next;
struct DuLNode *prior;
}DuLNode,*DuLinkList;
DuLinkList CreateDuLinkList();//创建双向链表
Status ListTraverse(DuLinkList L);//打印链表
int IsEmptyDuLinkList(DuLinkList L);
int GetLengthDbLinkList(DuLinkList L);//计算链表长度
Status ListInsert_DuL(DuLinkList L,int i,ElemType e);//插入节点
Status ListDelet_DuL(DuLinkList L,int i);//删除节点
void FreeMemory(DuLinkList *L);
int LocateElem(DuLinkList L,ElemType e);
Status GetElem(DuLinkList L,int i,ElemType *e);
#endif
**
在source files中创建
**
1.duLinkList.c
#include "DulinkList.h"
#include <stdio.h>
DuLinkList CreateDuLinkList(){//创建空的双向链表
DuLinkList L;
L=(DuLinkList)malloc(sizeof(DuLNode));
L->data=0;
L->prior=NULL;
L->next=NULL;
return L;
}
//计算链表的长度
int GetLengthDbLinkList(DuLinkList L)
{
int length = 0;
DuLinkList pt =L->next;
while (pt != NULL)
{
length++;
pt = pt->next;
}
return length;
}
int IsEmptyDuLinkList(DuLinkList L){
DuLinkList pt=L->next;
if(pt==NULL)
return OK;
else
return FALSE;
}
Status ListInsert_DuL(DuLinkList L,int i,ElemType e){//插入
DuLinkList pt,p_new;
pt=NULL;
p_new=NULL;
if(i>0&&i<GetLengthDbLinkList(L)+2){
p_new=(DuLinkList)malloc(sizeof(DuLNode));
if(NULL==p_new){
printf("内存分配失败!\n");
return ERROR;
}
while (1)
{
i--;
if (0 == i)
break;
L = L->next;
}
pt = L->next;
p_new->data = e;
p_new->next = pt;
if (NULL != pt)
pt->prior= p_new;
p_new->prior = L;
L->next = p_new;
return TRUE;
}
else
return FALSE ;
}
Status ListDelet_DuL(DuLinkList L,int i){//删除
DuLinkList pt=NULL;
if (i > 0 && i < GetLengthDbLinkList(L) + 1)
{
while (1)
{
i--;
if (0 == i)
break;
L = L->next;
}
pt = L->next->next;
free(L->next);
L->next = pt;
if (NULL != pt)
pt->prior = L;
return OK;
}
else
return ERROR ;
}
Status ListTraverse(DuLinkList L){//遍历输出
DuLinkList pt = NULL;
pt = L->next;
int k = 0;
while (pt)
{
printf("%4d", pt->data);
pt = pt->next;
k++;
}
if (k == 0)
{
printf("链表为空");
return ERROR;
}
return OK;
}
void FreeMemory(DuLinkList *L){
DuLinkList pt=NULL;
while(*L!=NULL){
pt=(*L)->next;
free(*L);
if(NULL!=pt)
pt->prior=NULL;
*L=pt;
}
}
int LocateElem(DuLinkList L,ElemType e){
DuLinkList p;
p=L->next;
int j=1;
while(p&&(p->data)!=e){
p=p->next;
j++;
}
if(p){
return j;
}else{
return 0;
}
}
Status GetElem(DuLinkList L,int i,ElemType *e)
{
//获取第i个元素的内容
DuLinkList p;
p=L->next;
int j=1;
while(p!=L&&j<i)
{
p=p->next;
j++;
}
if(p==L||j>i) return 0;
*e=p->data;
return OK;
}
2.main_duLinkLIst.c
#include "DulinkList.h"
#include <stdio.h>
void main(){
DuLinkList L;
ElemType e;
int j,n;
L=CreateDuLinkList();
printf("链表是否为空1为空 0为否:%d",IsEmptyDuLinkList(L));
ListInsert_DuL(L,1,1);
ListInsert_DuL(L,2,2);
ListInsert_DuL(L,3,3);
ListInsert_DuL(L,4,4);
printf("\n链表是否为空1为空 0为否:%d",IsEmptyDuLinkList(L));
printf("\n双向链表的长度为:%d",GetLengthDbLinkList(L));
printf("\n双向链表的元素为:");
ListTraverse(L);
ListDelet_DuL(L,3);
printf("\n删除后双向链表的元素为:");
ListTraverse(L);
printf("\n获取元素在链表中的位置:%d",LocateElem(L,4));
n=2;
j=GetElem(L,n,&e);
if(j)
printf("\n链表的第%d个元素值为%d\n",n,e);
else
printf("不存在第%d个元素\n",n);
FreeMemory(&L);
}