#include "stdafx.h" //VC工程用的,非VC的就不要这行了
#include
#include
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<<"请输入链表长度 "<
length=num;
cout<<"输入第1个元素 "<
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<<"现在的链表"<
{
cout<<"分别为:"<
cout<
}
cout<
void list::getlist()//按位查找链表
{
int num,j;
Node *p;
cout<<"请输入要查找的位数[0 - "<
if(num>=length||num<0)
{
cout<<"error"<
}
p=first;/*j=0; 多余*/
for(j=0; j
cout<<"您所查找的数是"<
void list::insertlist()//插入链表数据
{
int num,j,x;
Node *p=first,*s;
cout<<"请输入要插入的位置[0 - "<
//if (num>length||num<=0)
// cout<<"超出范围"<
if(num>length) num=length;//插最后
if(num<0) num = 0;//插最前面
cout<<"请输入要插入数的值"<
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 - "<
//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<<"超出范围"<
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<<"=======================链表的基本操作(菜单)========================"<
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按任意键继续..."<
getch();
}while(1);
}
////////////VC7下调试通过了,原来的BUG也改过了