双向链表:
双向链表的定义:
typedef struct DuLNode{
LElemType data;
struct DuLNode *next;
struct DuLNode *pre;
DuLNode ( LElemType Data=0,struct DuLNode *Pre=NULL,struct DuLNode *Next=NULL){
data=Data;
next=Next;
pre=Pre;
}
}DuLNode,*DuLinkList;
双向链表基本操作的实现:
(1)、初始化操作 InitDuLinkList( &L )
(2)、建立单链表的操作 CreateDuLinkList(&L , n)
(3)、判断一个线性表是否为空表ListIsEmpty(L)
(4)、求线性表的长度ListLength( L )
(5)、取线性表中的第i个元素GetElem(L,i,&e)
(6)、查找元素e在线性表中的位序LocateElem(L,e)
(7)、插入操作ListInsert(&L,i,e)
(8)、删除操作LIstDelete(&L,i,&e)
(1)、初始化操作 InitLinkList( &L )
void InitDuLinkList(DuLinkList &L){
L=new DuLNode;
}
(2)、建立单链表的操作 CreateLinkList(&L , n)
void CreateLinkList_Tail(DuLinkList &L,int n=0){ //尾插法
L=new DuLNode;
DuLinkList Pre=L,p;
LElemType data;
for(int i=1;i<=n;i++){
printf("请输入第%d个data值:\n",i);
cin>>data;
p=new DuLNode(data,Pre);
Pre->next=p;
Pre=p;
}
}
void CreateLinkList_Head(DuLinkList &L ,int n=0){//头插法
L=new DuLNode;
DuLinkList Pre=L,p,s;
LElemType data;
for(int i=1;i<=n;i++){
printf("请输入第%d个data值:\n",i);
cin>>data;
p=new DuLNode(data,Pre,Pre->next);
s=Pre->next;
if(s)
s->pre=p;
Pre->next=p;
}
}
(3)、判断一个线性表是否为空表ListIsEmpty(L)
int ListIsEmpty(DuLinkList &L){
if(L->next){
return 1;
}return 0;
}
(4)、求线性表的长度ListLength( L )
int ListLength(DuLinkList L){
int len=0;
DuLinkList p=L->next;
while(p){
len++;
p=p->next;
}
return len;
}
(5)、取线性表中的第i个元素GetElem(L,i,&e)
void GetElem(DuLinkList L,int i,LElemType &e){
int j=1;
DuLinkList p=L->next;
while(p&&j<i){
j++;
p=p->next;
}
if(j>i||!p){
printf("");
return ;
}
e=p->data;
}
(6)、查找元素e在线性表中的位序LocateElem(L,e)
LElemType LocateElem(DuLinkList L, LElemType e){
int j=1;
DuLinkList p=L->next;
while(p&&p->data!=e){
j++;
p=p->next;
}
if(!p){
printf("LocateElem not found %d\n",e);
return -1;
}
return j;
}
(7)、插入操作ListInsert(&L,i,e)
void ListInsert(DuLinkList L, int i, LElemType e){
int j=0;
DuLinkList p=L,s;
while(p&&j<i-1){
j++; p=p->next;
}
if(!p||i-1<j||!(p->next)){ //插入位置不能是最后
printf("ListInsert index %d error\n",i);
return ;
}
s=new DuLNode(e,p,p->next);
(p->next)->pre=s;
s->pre=p;
p->next=s;
}
(8)、删除操作LIstDelete(&L,i,&e)
void ListDelete(DuLinkList &L,int i,LElemType &e){
int j=0;
DuLinkList p=L,s;
while(p->next&&j<i-1){
j++;
p=p->next;
}
if(!p->next||i<=j){
printf("\" ListDelete \" index : %d error\n",i);
return ;
}
s=p->next;
p->next=s->next;
(s->next)->pre=p;
e=s->data;
delete s;
}
完整的测试代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#define LElemType int
using namespace std;
typedef struct DuLNode{
LElemType data;
struct DuLNode *next;
struct DuLNode *pre;
DuLNode ( LElemType Data=0,struct DuLNode *Pre=NULL,struct DuLNode *Next=NULL){
data=Data;
next=Next;
pre=Pre;
}
}DuLNode,*DuLinkList;
void InitDuLinkList(DuLinkList &L){
L=new DuLNode;
}
void CreateLinkList_Tail(DuLinkList &L,int n=0){ //尾插法
L=new DuLNode;
DuLinkList Pre=L,p;
LElemType data;
for(int i=1;i<=n;i++){
printf("请输入第%d个data值:\n",i);
cin>>data;
p=new DuLNode(data,Pre);
Pre->next=p;
Pre=p;
}
}
void CreateLinkList_Head(DuLinkList &L ,int n=0){//头插法
L=new DuLNode;
DuLinkList Pre=L,p,s;
LElemType data;
for(int i=1;i<=n;i++){
printf("请输入第%d个data值:\n",i);
cin>>data;
p=new DuLNode(data,Pre,Pre->next);
s=Pre->next;
if(s)
s->pre=p;
Pre->next=p;
}
}
void OutputDuLinkList(DuLinkList &L){
DuLinkList p=L->next,t;
printf("按顺序输出\n");
while(p){
printf("%d\n",p->data);
t=p;
p=p->next;
}
printf("按逆序输出\n");
p=t;
while(p->pre){
printf("%d\n",p->data);
p=p->pre;
}
}
int ListIsEmpty(DuLinkList &L){
if(L->next){
return 1;
}return 0;
}
int ListLength(DuLinkList L){
int len=0;
DuLinkList p=L->next;
while(p){
len++;
p=p->next;
}
return len;
}
void GetElem(DuLinkList L,int i,LElemType &e){
int j=1;
DuLinkList p=L->next;
while(p&&j<i){
j++;
p=p->next;
}
if(j>i||!p){
printf("");
return ;
}
e=p->data;
}
LElemType LocateElem(DuLinkList L, LElemType e){
int j=1;
DuLinkList p=L->next;
while(p&&p->data!=e){
j++;
p=p->next;
}
if(!p){
printf("LocateElem not found %d\n",e);
return -1;
}
return j;
}
void ListInsert(DuLinkList L, int i, LElemType e){
int j=0;
DuLinkList p=L,s;
while(p&&j<i-1){
j++; p=p->next;
}
if(!p||i<=j){
printf("ListInsert index %d error\n",i);
return ;
}
s=new DuLNode(e,p,p->next);
(p->next)->pre=s;
p->next=s;
}
void ListDelete(DuLinkList &L,int i,LElemType &e){
int j=0;
DuLinkList p=L,s;
while(p->next&&j<i-1){
j++;
p=p->next;
}
if(!p->next||i<=j){
printf("\" ListDelete \" index : %d error\n",i);
return ;
}
s=p->next;
p->next=s->next;
(s->next)->pre=p;
e=s->data;
delete s;
}
int main()
{
DuLinkList La;
LElemType e=0,t;
CreateLinkList_Tail(La,5);
//CreateLinkList_Head(La,5);
OutputDuLinkList(La);
printf("len=%d\n",ListLength(La));
for(int i=1;i<=5;i++){
GetElem(La,i,e);
printf("%d\n",e);
}
/*printf("请输入一个需要查找的数: \n");
scanf("%d",&e);
t=LocateElem(La,e);
if(t!=-1){
printf("Found!!! %d\n",t);
}*/
ListInsert(La,2,123);
OutputDuLinkList(La);
e=0;
ListDelete(La,2,e);
OutputDuLinkList(La);
if(e!=0){
printf("删除的元素为: %d \n",e);
}
return 0;
}