using namespace std;
//双链表的基本操作
typedef struct doList{
struct doList *prior;//前驱
struct doList *next;//后缀
int data;//数据域
}doList,*doLinklist;//数据结构
void InitdoList(doLinklist &L){//初始化循环双链表
L=(doLinklist)malloc(sizeof(doList));//为头结点分配空间
if(!L)exit(-1);//判断空间能否分配成功
L->next=L;//使头结点的前驱后继均指向本人
L->prior=L;//建立一个带有头结点的空链表
}
int getLengthdolist(doLinklist &L){//计算表的长度
doLinklist p;//建立一个指针
int Length=0;
//if(!L)exit(-1);//看表能否建立成功
p=L->next;//指向第一个结点
while(p!=L){
p=p->next;//指针后移
Length++;//长度依次增加
}
return Length;
}
void Creatdolist(doLinklist &L,int n){//创建一个长度为n的循环双链表(尾插法)
doLinklist p;//建立一个指针
doLinklist q;
//InitdoList(L);//初始化一个空表
int elem=0,i=0;
p=L;
cout<<“请输入双链表的元素:”<<endl;
for(i=0;i<n;i++){
cin>>elem;//输入元素
q=(doLinklist)malloc(sizeof(doList));//为新插入的结点分配空间
q->data=elem;
p->next=q;
p=q;
q->prior=p;//尾插法插入结点
}
p->next=L;//将最后一个结点的next域指向头指针
}
void outputdoList(doLinklist &L){//输出元素
doLinklist p;
p=L->next;//使指针指向第一个结点
cout<<“双链表中的元素为:”<<endl;
while(p!=L){
cout<<p->data<<” “;
p=p->next;
}
cout<<endl;
}
int deletedoList(doLinklist &L,int i,int &e){//删除第i个结点,并用e返回其值
doLinklist p;
if(i<=0 || i>getLengthdolist(L))exit(-1);//判断i能否合格
p=L;
for(int j=1;j<=i;j++){
p=p->next;
}//将指针移至第i个结点
e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;//改变指针指向
free(p);//释放结点空间
return e;
}
void InsertdoList(doLinklist &L,int i,int e){//在第i个元素之前插入一个值为e的元素
doLinklist p;
p=L;
if(i<=0 || i>getLengthdolist(L))exit(-1);//判读i能否合格
for(int j=1;j<=i;j++){
p=p->next;//将指针移至第i个元素
}
doLinklist q=(doLinklist)malloc(sizeof(doList));//创建一个新节点
q->data=e;
q->prior=p->prior;
p->prior->next=q;
q->next=p;
p->prior=q;//修改指针域
}
int main()
{
doLinklist L;
InitdoList(L);
int e=0;
Creatdolist(L,8);//长度为8的循环双链表
outputdoList(L);//输出链表元素
cout<<“删除的元素为:”<<deletedoList(L,5,e)<<endl;
outputdoList(L);//运行到这一步时错了
cout << “Hello world!” << endl;
return 0;
}
60
错误来自于你的Creatdolist函数里的prior有问题(next指针是对的,所以输出没问题,原因是输出只用到next指针)
for循环里q->prior=p;p=q;这两句应该换一个位置
#include <iostream> using namespace std; //双链表的基本操作 typedef struct doList{ struct doList *prior;//前驱 struct doList *next;//后缀 int data;//数据域 }doList,*doLinklist;//数据结构 void InitdoList(doLinklist &L){//初始化循环双链表 L=(doLinklist)malloc(sizeof(doList));//为头结点分配空间 if(!L)exit(-1);//判断空间能否分配成功 L->next=L;//使头结点的前驱后继均指向本人 L->prior=L;//建立一个带有头结点的空链表 } int getLengthdolist(doLinklist &L){//计算表的长度 doLinklist p;//建立一个指针 int Length=0; //if(!L)exit(-1);//看表能否建立成功 p=L->next;//指向第一个结点 while(p!=L){ p=p->next;//指针后移 Length++;//长度依次增加 } return Length; } void Creatdolist(doLinklist &L,int n){//创建一个长度为n的循环双链表(尾插法) doLinklist p;//建立一个指针 doLinklist q; //InitdoList(L);//初始化一个空表 int elem=0,i=0; p=L; cout<<"请输入双链表的元素:"<<endl; for(i=0;i<n;i++){ cin>>elem;//输入元素 q=(doLinklist)malloc(sizeof(doList));//为新插入的结点分配空间 q->data=elem; p->next=q; q->prior=p;//尾插法插入结点 p=q; } p->next=L;//将最后一个结点的next域指向头指针 } void outputdoList(doLinklist &L){//输出元素 doLinklist p; p=L->next;//使指针指向第一个结点 cout<<"双链表中的元素为:"<<endl; while(p!=L){ cout<<p->data<<" "; p=p->next; } cout<<endl; } int deletedoList(doLinklist &L,int i,int &e){//删除第i个结点,并用e返回其值 doLinklist p; if(i<=0 || i>getLengthdolist(L))exit(-1);//判断i能否合格 p=L; for(int j=1;j<=i;j++){ p=p->next; }//将指针移至第i个结点 e=p->data; p->prior->next=p->next; p->next->prior=p->prior;//改变指针指向 free(p);//释放结点空间 return e; } void InsertdoList(doLinklist &L,int i,int e){//在第i个元素之前插入一个值为e的元素 doLinklist p; p=L; if(i<=0 || i>getLengthdolist(L))exit(-1);//判读i能否合格 for(int j=1;j<=i;j++){ p=p->next;//将指针移至第i个元素 } doLinklist q=(doLinklist)malloc(sizeof(doList));//创建一个新节点 q->data=e; q->prior=p->prior; p->prior->next=q; q->next=p; p->prior=q;//修改指针域 } int main() { doLinklist L; InitdoList(L); int e=0; Creatdolist(L,8);//长度为8的循环双链表 outputdoList(L);//输出链表元素 cout<<"删除的元素为:"<<deletedoList(L,5,e)<<endl; outputdoList(L);//运行到这一步时错了 cout << "Hello world!" << endl; return 0; }
10
提醒:再牛×的老师也无法代替学生本人领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。