一.概念
二.基本操作
1.定义
//定义双向链表
typedef struct DoubleLinkedNode{
int data;
struct DoubleLinkedNode *previous;
struct DoubleLinkedNode *next;
}DLnode,*Dlinklist;
2.初始化
Dlinklist Initialist()
{
Dlinklist tempHeader=(Dlinklist)malloc(sizeof(DLnode));
tempHeader->next=NULL;
tempHeader->previous=NULL;
return tempHeader;
}
3.头插法建立双链表
Dlinklist create_head(Dlinklist tempHeader,int n)
{
tempHeader=(Dlinklist)malloc(sizeof(DLnode));
tempHeader->previous=NULL;
tempHeader->next=NULL;
Dlinklist r;
r=tempHeader;
DLnode *p;
int i;
for(i=0;i<n;i++)
{
p=(DLnode*)malloc(sizeof(DLnode));
scanf("%d",&p->data);
if(r->next==NULL)
{
r->next=p;
p->previous=r;
p->next=NULL;
}
else{
//一上一下 ,先上后下
p->previous=r;
r->next->previous=p;
p->next=r->next;
r->next=p;
}
}
return tempHeader;
}
4.尾插法建立双向链表
Dlinklist create_tail(Dlinklist tempHeader,int n)
{
tempHeader=(Dlinklist)malloc(sizeof(DLnode));
DLnode *r,*q;
r=tempHeader;
tempHeader->previous=NULL;
tempHeader->next=NULL;
int i;
for(i=0;i<n;i++)
{
q=(DLnode*)malloc(sizeof(DLnode));
scanf("%d",&q->data);
r->next=q;
q->previous=r;
r=q;
}
r->next=NULL;
return tempHeader;
}
5.求链表长度
int Lengthlist(Dlinklist paraHeader)
{
DLnode *p;
int i=0;
p=paraHeader->next;
while(p)
{
i++;
p=p->next;
}
return i;
}
6.打印链表
//双向链表打印
void Print(Dlinklist tempHeader)
{
DLnode *p;
p=tempHeader->next;
while(p)
{
printf("%5d",p->data);
p=p->next;
}
printf("\n");
}
7.在第i个位置插入元素
Dlinklist Insertlist(Dlinklist tempHeader,int i,int e)
{
int j=0;
DLnode *p,*s,*r;
p=tempHeader;
for(j=0;j<i-1;j++)
{
p=p->next;
j++;
}
if(!p||j>i-1)
{
printf("The position %d is beyond the scope of the list",i);
return;
}//判断条件写在外面
r=p->next;
s=(DLnode*)malloc(sizeof(DLnode));
s->data=e;
s->previous=p;
p->next->previous=s;
s->next=p->next;
p->next=s;
return tempHeader;
}
8获取第i个位置的元素
int Getelem(Dlinklist tempHeader,int i)
{
int j;
int elem;
DLnode *p;
p=tempHeader->next;
for(j=1;j<i;j++)//找到第i个位置
{
p=p->next;
}
if (!p||j>i)
return 0;
else
{
elem=p->data;
}
return elem;
}
9.获取元素e的地址或位置序号
//找到元素e的位置(返回地址或位置序号)
DLnode *LocateElem(Dlinklist tempHeader,int e)
{
DLnode *p;
p=tempHeader->next;
while(p&&p->data!=e)
{
p=p->next;
}
return p;//查找失败返回NULL
}
int LOcateelem(Dlinklist tempHeader,int e)
{
DLnode *p;
p=tempHeader->next;
int i;
for(i=1;p&&p->data!=e;i++)
{
p=p->next;
}
if(p)
return i;
else
return 0;//查找失败
}
int Lengthlist(Dlinklist paraHeader)
{
DLnode *p;
int i=0;
p=paraHeader->next;
while(p)
{
i++;
p=p->next;
}
return i;
}
10.删除元素
//删除第position个位置的元素
Dlinklist deletelist(Dlinklist tempHeader,int position)
{
DLnode *p;
int i;
p=tempHeader;
for(i=0;i<position;i++)
{
p=p->next;
}
if(!(p->next)||i>position)
printf("could not find the elem\n");//find position
int e=p->data;
p->previous->next=p->next;
p->next->previous=p->previous;
free(p);
return tempHeader;
}
三.完整代码
#include <stdio.h>
#include <stdlib.h>
//定义双向链表
typedef struct DoubleLinkedNode{
int data;
struct DoubleLinkedNode *previous;
struct DoubleLinkedNode *next;
}DLnode,*Dlinklist;
Dlinklist Initialist()
{
Dlinklist tempHeader=(Dlinklist)malloc(sizeof(DLnode));
tempHeader->next=NULL;
tempHeader->previous=NULL;
return tempHeader;
}
//链表头插结点
Dlinklist create_head(Dlinklist tempHeader,int n)
{
tempHeader=(Dlinklist)malloc(sizeof(DLnode));
tempHeader->previous=NULL;
tempHeader->next=NULL;
Dlinklist r;
r=tempHeader;
DLnode *p;
int i;
for(i=0;i<n;i++)
{
p=(DLnode*)malloc(sizeof(DLnode));
scanf("%d",&p->data);
if(r->next==NULL)
{
r->next=p;
p->previous=r;
p->next=NULL;
}
else{
//一上一下 ,先上后下
p->previous=r;
r->next->previous=p;
p->next=r->next;
r->next=p;
}
}
return tempHeader;
}
//链表尾插结点
Dlinklist create_tail(Dlinklist tempHeader,int n)
{
tempHeader=(Dlinklist)malloc(sizeof(DLnode));
DLnode *r,*q;
r=tempHeader;
tempHeader->previous=NULL;
tempHeader->next=NULL;
int i;
for(i=0;i<n;i++)
{
q=(DLnode*)malloc(sizeof(DLnode));
scanf("%d",&q->data);
r->next=q;
q->previous=r;
r=q;
}
r->next=NULL;
return tempHeader;
}
//双向链表打印
void Print(Dlinklist tempHeader)
{
DLnode *p;
p=tempHeader->next;
while(p)
{
printf("%5d",p->data);
p=p->next;
}
printf("\n");
}
Dlinklist Insertlist(Dlinklist tempHeader,int i,int e)
{
int j=0;
DLnode *p,*s,*r;
p=tempHeader;
for(j=0;j<i-1;j++)
{
p=p->next;
j++;
}
if(!p||j>i-1)
{
printf("The position %d is beyond the scope of the list",i);
return;
}//判断条件写在外面
r=p->next;
s=(DLnode*)malloc(sizeof(DLnode));
s->data=e;
s->previous=p;
p->next->previous=s;
s->next=p->next;
p->next=s;
return tempHeader;
}
int Getelem(Dlinklist tempHeader,int i)
{
int j;
int elem;
DLnode *p;
p=tempHeader->next;
for(j=1;j<i;j++)//找到第i个位置
{
p=p->next;
}
if (!p||j>i)
return 0;
else
{
elem=p->data;
}
return elem;
}
//找到元素e的位置(返回地址或位置序号)
DLnode *LocateElem(Dlinklist tempHeader,int e)
{
DLnode *p;
p=tempHeader->next;
while(p&&p->data!=e)
{
p=p->next;
}
return p;//查找失败返回NULL
}
int LOcateelem(Dlinklist tempHeader,int e)
{
DLnode *p;
p=tempHeader->next;
int i;
for(i=1;p&&p->data!=e;i++)
{
p=p->next;
}
if(p)
return i;
else
return 0;//查找失败
}
int Lengthlist(Dlinklist paraHeader)
{
DLnode *p;
int i=0;
p=paraHeader->next;
while(p)
{
i++;
p=p->next;
}
return i;
}
//删除第position个位置的元素
Dlinklist deletelist(Dlinklist tempHeader,int position)
{
DLnode *p;
int i;
p=tempHeader;
for(i=0;i<position;i++)
{
p=p->next;
}
if(!(p->next)||i>position)
printf("could not find the elem\n");//find position
int e=p->data;
p->previous->next=p->next;
p->next->previous=p->previous;
free(p);
return tempHeader;
}
int main()
{
int n;
printf("Please print the length\n");
scanf("%d",&n);
Dlinklist tempHeader,paraHeader;
tempHeader=Initialist();
tempHeader=create_head(tempHeader,n);
Print(tempHeader);
paraHeader=Initialist();
paraHeader=create_tail(tempHeader,n);
Print(paraHeader);
printf("Print the location and elem you want to insert\n");
int position,e;
Dlinklist L;
scanf("%d%d",&position,&e);
L=Insertlist(paraHeader,position,e);
printf("THe new list is \n");
if(L)
{
Print(L);
}
int place;
printf("Print the place you want to find\n");
scanf("%d",&place);
int result_1;
result_1=Getelem(L,place);
if(result_1)
printf("THe elem is %d\n",result_1);
DLnode *f;
int elem1;
printf("print the elem you want to select\n");
scanf("%d",&elem1);
f=LocateElem(L, elem1);
if(f)
printf("THe address is %p\n",f);
else
printf("could not find \n");
int result_2;
result_2=LOcateelem(L,elem1);
if(result_2)
printf("THe location is %d\n",result_2);
else
printf("could not find\n");
int result_3=Lengthlist(L);
printf("THe length is %d\n",result_3);
int po;
printf("Print the position you want to delete\n");
scanf("%d",&po);
L=deletelist(L,po);
printf("THe new list is %d:\n");
Print(L);
return 0;
}
四.运行展示