有问题的可以留言,这里给出代码的文档,
/*这个程序是用来练习双向链表的*/
#include
#include
#include
constintTRUE=1;
constintFALSE=0;
constintMAXSIZE=10;
usingnamespacestd;
//定义链表中存储的数据类型
typedefintElemtype;
//定义函数返回值的数据类型
typedefElemtypeStatus;
//定义单链表结构
typedefstructDNode{
Elemtypedata;
DNode*prior;//这个指针指向Node数据类型的上一个存储地址
DNode*next;//这个指针指向Node数据类型的下一个存储地址
}DNode;//给Node数据类型起名字,可以改成其他名字
typedefstructDNode*DLinkList;/*定义一个指向链表的指针,这里的链表就是Node节点一个个组成的*/
StatusGetElem(DLinkListL,inti,Elemtype*e);/*获取链表中的元素*/
voidShowList(DLinkListL);/*展示链表的内容*/
voidCreateListRear(DLinkListL,intn);//尾插法创建单链表
StatusListInsert(DLinkListL,inti,Elemtypee);/*用来向链表内插入元素*/
StatusListDelete(DLinkListL,inti);/*用来删除链表中指定下表的节点*/
StatusClearList(DLinkListL);/*清楚整张表的内容*/
StatusCreateCycle(DLinkListL);/*将原来的链表生成循环,头指针和尾部相连,不启用这个函数就只是生成普通的双向链表*/
intListLength(DLinkListL);/*计算链表的长度*/
intmain(void){
DLinkListL1;
CreateListRear(L1,MAXSIZE);
ShowList(L1);
cout"\n请输入要读取的元素序号(1-?):\n";
intindex;
cinindex;
Elemtype*e;
e=(Elemtype*)malloc(sizeof(Elemtype));
Statuselem;
elem=GetElem(L1,index,e);
cout"结果为:\n"elem;
cout"\n请输入要插入元素的位置(1-?):\n";
cinindex;
cout"请输入要插入的整数:\n";
cin(*e);
ListInsert(L1,index,(*e));
free(e);
ShowList(L1);
cout"\n请输入要删除的节点序号(1-?):\n";
cinindex;
ListDelete(L1,index);
ShowList(L1);
cout"现在清空链表\n";
ClearList(L1);
ShowList(L1);
return0;
}
StatusGetElem(DLinkListL,inti,Elemtype*e){
DLinkListp;//定义一个工具指针;
p=L;
intlengthL=ListLength(L),k=1;
if(ilengthL
i=0){
cout"所给的下标超出链表范围!!!\n";
returnFALSE;
}
while(p-next!=NULL){
if(k=i){//说明已经迭代到了要找的元素的上一个元素
break;
}
p=p-next;//将指针后移寻找对应序号的元素
k++;
}
returnp-next-data;
}
voidShowList(DLinkListL){
DLinkListp;
p=L;
cout"链表中的元素为:\n";
while(p-next!=NULL){
coutnext-data"";
p=p-next;
}
}
voidCreateListRear(DLinkListL,intn){
DLinkListp,rear;
srand(time(0));/*初始化随机数种子*/
L=newDNode;
L-next=NULL;/*先建立一个带头结点的单链表*/
L-prior=NULL;
rear=L;
for(inti=0;in;i++)
{
p=newDNode;/*生成新的节点*/
p-data=rand()%+1;
rear-next=p;
p-prior=rear;
p-next=NULL;
rear=rear-next;/*尾部指针向后移动*/
}
}
StatusListInsert(DLinkListL,inti,Elemtypee){
DLinkListp;//定义一个工具指针;
p=L;
intlengthL=ListLength(L),k=1;
if(ilengthL+1
i=0){
cout"所给的下标超出链表范围!!!\n";
returnFALSE;
}
while(p-next!=NULL){
if(k=i){//说明已经迭代到了要找的元素的上一个元素
break;
}
p=p-next;//将指针后移寻找对应序号的元素
k++;
}
DNode*node=newDNode;
node-data=e;
if(p-next==NULL){//说明要插入的序号在列表最后一个
p-next=node;
node-prior=p;
node-next=NULL;
cout"元素插入成功!!\n";
returnTRUE;
}
node-next=p-next;
p-next-prior=node;
node-prior=p;
p-next=node;
cout"元素插入成功!!\n";
returnTRUE;
}
StatusListDelete(DLinkListL,inti){
DLinkListp,e;//定义一个工具指针;
p=L;
intlengthL=ListLength(L),k=1;
if(ilengthL
i=0){
cout"所给的下标超出链表范围!!!\n";
returnFALSE;
}
while(p-next!=NULL){
if(k=i){//说明已经迭代到了要找的元素的上一个元素
break;
}
p=p-next;//将指针后移寻找对应序号的元素
k++;
}
e=p-next;
if(p-next-next==NULL){//说明要删除的是最后一个元素
p-next-prior=NULL;
p-next=NULL;
free(e);
cout"删除成功\n";
returnTRUE;
}
//说明要删除的时列表中的元素
p-next-next-prior=p;
p-next=p-next-next;
free(e);
cout"删除成功";
returnTRUE;
}
StatusClearList(DLinkListL){
DLinkListp,q;
p=L-next;
while(p!=NULL){
q=p-next;
free(p);
p=q;
}
L-next=NULL;/*头节点指针域置空*/
L-prior=NULL;
returnTRUE;
}
StatusCreateCycle(DLinkListL){
DLinkListp;
p=L;
while(p-next!=NULL){
p=p-next;
}
L-prior=p;
p-next=L;
cout"修改成功!\n";
returnTRUE;
}
intListLength(DLinkListL){
DLinkListp;
p=L;
intj=0;
while(p-next!=NULL){
j++;
p=p-next;
}
returnj;
}