所在的位置: C++ >> C++前景 >> c双向链表实现

c双向链表实现

这是普通的双向链表实现。

有问题的可以留言,这里给出代码的文档,

/*这个程序是用来练习双向链表的*/

#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;

}




转载请注明:http://www.aierlanlan.com/cyrz/3513.html