Code Bye

数据结构循环双链表问题最后运行都成死循环了

#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;
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执行停在该断点处。)是程序员必须掌握的技能之一。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明数据结构循环双链表问题最后运行都成死循环了