这是我编的单链表程序(C++),编译无错,该怎么改改,让它成为一个双链表呢??求高手帮我改下。

2024-12-12 23:35:57
推荐回答(1个)
回答1:

#include "stdafx.h" //VC工程用的,非VC的就不要这行了
#include
#include //getch()头文件
using namespace std;
struct Node{
int data;
struct Node *pre; //<<<***双向的话加一个指向前面的指针
struct Node *next;
}; //<<<***这个花括号和分号原文中没有提供?? 少了可就编译不过了
class list
{
public:
void addlist();// 构建链表
void showlist();//显示链表
void getlist();//按位查找链表
void insertlist();//元素插入链表
void deletelist();//删除链表
private:
Node *first;
int length;
};
void list::addlist()//构建链表
{
int num,i;
Node *p=NULL,*q=NULL;
cout<<"请输入链表长度 "< cin>>num;
length=num;
cout<<"输入第1个元素 "< p=new Node;
p->pre = NULL;//<<<***首指针的向前指针为空
cin>>p->data;
list::first=p;
for(i=1;i {
q=p;
p=new Node;
cout<<"请输入第"< cin>>p->data;
q->next=p;
p->pre = q; //<<< 添加处理pre的行
}
p->next=NULL;
}
void list::showlist()//显示链表
{
cout<<"现在的链表"< if(length)
{
cout<<"分别为:"< for(Node *p = /* list:: */ first;p!=NULL;p=p->next)
cout<data<<" ";
}
cout<}
void list::getlist()//按位查找链表
{
int num,j;
Node *p;
cout<<"请输入要查找的位数[0 - "< cin>>num;
if(num>=length||num<0)
{
cout<<"error"< return;//如果if进来不会走到下面去,后面无需else了
}
p=first;/*j=0; 多余*/
for(j=0; j p=p->next;
cout<<"您所查找的数是"<data<}
void list::insertlist()//插入链表数据
{
int num,j,x;
Node *p=first,*s;
cout<<"请输入要插入的位置[0 - "< cin>>num;
//if (num>length||num<=0)
// cout<<"超出范围"< //else
if(num>length) num=length;//插最后
if(num<0) num = 0;//插最前面
cout<<"请输入要插入数的值"< cin>>x;
s=new Node;
s->data=x;
if(num==0)//插头结点之前
{
first->pre = s; //<<<双向链表才有的
s->pre=NULL; //<<<双向链表才有的
s->next = first;
first = s; //first指向新的头结点位置
}
else//插在第num-1个元素后
{
for(j=0;j {
p=p->next;
}
s->pre = p; //<<<双向链表处理
if(p->next) //<<<双向链表处理
p->next->pre = s; //当不是最后一个元素时都会执行此行
s->next=p->next;
p->next=s;
}
length++; //<<<***原来就没加这一行,一定要加的
}
void list::deletelist()//删除链表
{
int num,i;
Node *p=first,*q;
cout<<"输入要删除的数的位置[0 - "< cin>>num;
//q=new Node;
//for(i=0;i<=num-3;i++)//为什么num-3的时候刚好可以呢????(要问)全错的,懒得答
// p=p->next;
//q=p->next;
//p->next=q->next;
if (num>length-1 || num<0){ cout<<"超出范围"< for(q=first,i=0; inext);//定义第num个
if(q==first)//删头结点
{
first = first->next;
first->pre=NULL;
}
else
{
p->pre->next = p->next;
if(p->next)
p->next->pre = p->pre;//当是尾结点时此行不执行
}
delete q; //释放空间
length--; //长度减1
}
void main()//主函数
{
list t;
int y;
t.addlist();
t.showlist();
do{//循环做
system("cls");//清屏 以便显示菜单
cout<<"=======================链表的基本操作(菜单)========================"< cout<<"=======================1、按位查找链表============================="< cout<<"=======================2、删除链表================================="< cout<<"=======================3、添加链表================================="< cout<<"=======================4、退出程序================================="< cout<<"==================================================================="< cout<<"选择要执行的编号(1-4):"< cin>>y;
switch(y)
{
case 1:
t.getlist();t.showlist();
break;
case 2:
t.deletelist();t.showlist();break;
case 3:
t.insertlist();t.showlist();break;
case 4:
exit(0);
default:
cout<<"无效的选择!"< }
cout<<"\n按任意键继续..."< fflush(stdin);
getch();
}while(1);
}
////////////VC7下调试通过了,原来的BUG也改过了