求高手看c++里的链表。指针返回有问题。求改正。。。。急!!!!!!!

#include<iostream>
using namespace std;
struct reserve
{
int num;
reserve *next;
};
reserve *createList(int);
reserve *reserved(reserve *firstHead);
void display(reserve *head);
int main()
{
int n;
reserve *listHead=NULL,*re;
cout<<"请输入个数:"<<endl;
cin>>n;
if(n>0)
listHead=createList(n);
re=reserved(listHead);
display(re);
return 0;
}
reserve *createList(int n)
{
int x;
reserve *head=NULL,*tail=NULL,*temp=NULL;
cout<<"请输入"<<n<<"个数"<<endl;
cin>>x;
head=new reserve;
if(head==NULL)
return head;
else
{
head->num=x;
head->next=NULL;
tail=head;
}
for(int i=0;i<n-1;i++)
{
cin>>x;
temp=new reserve;
if(temp==NULL)
return head;
else
{
temp->num=x;
temp->next=NULL;
tail->next=temp;
tail=temp;
}
}
return head;
}
reserve *reserved(reserve *firstHead)
{
reserve *head=firstHead,*tail=NULL;
reserve *first=new reserve;
if(first==NULL)
return first;
reserve *m=NULL;
reserve *s_first=first; //想用s_first来保存头结点的指针。
while(firstHead->next)
{
m=firstHead;
firstHead=firstHead->next;
}
tail=firstHead; //尾指针给tail
first=tail;
cout<<first->num<<" ";
m->next=NULL;
delete tail;
reserve *temp=NULL;
do
{
firstHead=head;
temp=new reserve;
if(temp==NULL)
return temp;
while(firstHead->next)
{
m=firstHead;
firstHead=firstHead->next;
}
m->next=NULL;
temp=firstHead;
first->next=temp;
first=temp;
cout<<temp->num<<" ";
delete temp;
}while(temp!=head);
return s_first; //头指针返回错了。为什么啊?!!
}
void display(reserve *head)
{
cout<<head->num;
}


问题出在Delete时的head传递上,修改如下:

class book
{
public:
int num;
float price;
book *next;
};

book*head=NULL; //为什么要声明这个全局变量?

bool check(string str) //检查用户输出是否为字符
{
for(int i=0;i<str.length();i++)
{
if((str[i]>'9' || str[i]<'0') && (str[i]!='.'))
return false;
}
return true;
}

book *creat() //返回book类的指针
{
book *p1,*p2;
p1=new book;
head=p1;
p2=p1;
cout<<"请输出图书的编号,以0结束"<<endl;
string str;
cin>>str;
while(!check(str))
{
cout<<"输入的不是数字,请重新输入,按0返回!!";
cin>>str;
}
p1->num=atoi(str.c_str()); //str调用类成员函数c_str把输入的string字符串转化成字

//符数组型,再由atoi转化成整数型。
// //c_str()成员函数返

// 回的是*char类型的临时指针,要把返回值赋给某变量名应该用strcpy函数
if(p1->num!=0)
{
cout<<"请输入图书的价格"<<endl;
cin>>str;
while(!check(str))
{
cout<<"输入的不是数字,请重新输入,按0返回!!";
cin>>str;
}
p1->price=atof(str.c_str()); //atof会把字符串转化成浮点型数值
}
else
{
delete p1;
p1=NULL;
head=NULL;
return head;
}
while(p1->num!=0)
{
p2=p1;
p1=new book;
cout<<"请输出图书的编号,以0结束"<<endl;
cin>>str;
while(!check(str))
{
cout<<"输入的不是数字,请重新输入,按0返回!!";
cin>>str;
}
p1->num=atoi(str.c_str());
if(p1->num!=0)
{
cout<<"请输入图书的价格"<<endl;
cin>>str;
while(!check(str))
{
cout<<"输入的不是数字,请重新输入,按0返回!!";
cin>>str;
}
p1->price=atof(str.c_str());
}
p2->next=p1;
}
delete p1;
p2->next=NULL;
return head;
}

void showbook(book *head)
{
cout<<endl;
cout<<"图书信息如下:"<<endl;
while(head)
{
cout<<"图书编号:"<<head->num<<"价格:"<<head->price<<endl;
head=head->next;
}

}

book *Delete(book *head,int num)
{
book *l;
if(head->num==num)
{
l=head;
head=head->next;
//::head=head; //赋给全局的head;
delete l;
cout<<"操作成功"<<endl;
return head;
}
while(head)
{
if(head->next==NULL)
{
cout<<"找不到要删除的编号."<<endl;
return head;
}
if(head->next->num==num)
{
l=head->next;
head->next=l->next;
delete l;
cout<<"操作成功"<<endl;
return head;
}
head=head->next;
}
cout<<"找不到要删除的编号."<<endl;
return head;
}

int main()
{
book *head;
head=creat();
showbook(head);
showbook(head);
cout<<"请输入你要删除的图书编号"<<endl;
int booknum;
cin>>booknum;
head=Delete(head,booknum);
showbook(head);
return 0;
}

函数内部会形成一个head的副本,就是说你给进来参数*head,但实际上函数内部的所有操作实际是对head的副本"head"(它不是真正的head,只是二者指向同一个位置)进行操作的。如果改变"head"的指向,原始的head并不会被改变,只是副本的head被指向另外的位置。
另外new的内存,一定要delete,子函数结束不会自己释放的
温馨提示:内容为网友见解,仅供参考
无其他回答

C++中带头节点的动态链表,头节点指针内存分配出错
如果没有first = new Node的话,就代表first没有指向一段内存,所以你要引用其中的东西肯定会崩溃,指针必须指向内存,不然就是所谓的野指针,而p指向first,意思是p和first指向同一段内存,其实还是没内存不是?所以出错了,记住一点就是指针必须有指向的内存 ...

C语言链表问题 DEVC++编译出error:too many arguments to functi...
你在main函数内声明了一个int deleteNode();函数,这个表明deleteNode函数是没有参数的。所以你后面的调用才出了问题。其实完全没有必要再声明的呀。

c++中建立链表中的问题 为什么head头指针变化了呢?\/?求大神啊
include<iostream> using namespace std;class User { char *name;public:User() { name = NULL; } User(char *name) { this->name = new char[strlen(name) + 1];strcpy(this->name,name);} User(const User &user) { name = new char[strlen(user.name) + 1];strcpy(name,user....

C++中关于局部指针的问题
getptr函数运行完毕后p变量是会被释放的,但是p->next代表的是你的链表中其中一个节点的指针域,这个可不是局部变量,而是链表本身的数据,返回它的引用没有任何问题。

c++链表问题
还是 [25 | ]--->[ ? | ? ]?问号代表不知道 答:S->link的值发生改变,指向了一个新的内存区域。如果r=s->link会是什么样的结构?答:链表的结构就是图中所示了,r就是S的指针域指向的下一个节点。提示:r的指针域不为NULL,不能作为链表的尾节点哦,要给r->link=NULL;...

c++ 链表 删除各种情况节点问题。。。求教。。在线等。。。
一、结尾节点无法删除的问题,你可以想象一个只有三个节点的链表,结尾节点的ID=findid,开始时,p指向第二个节点,然后执行到第一个if时,由于p->next->ID==findid,于是执行第二个if语句,但是此时p->next->next是等于NULL的,所以删除节点的代码没被执行。二、当只有一个结点时,因为一开始定义...

新手在关于C++程序中指针编程中遇到一问题,求各位大虾不吝赐教...
student *head=NULL;student *p[6];student.p[0]=head; 这一句有问题,应是 p[0] = head;另外,请将报错内容贴上 应该就是上面一句的问题,你改后试试

c++多项式加法 链表
void Input(int X[],int Z[],int *n);void Show(int X[],int Z[],int n);void Add(int XA[],int ZA[],int nA,int XB[],int ZB[],int nB,int XC[],int ZC[],int *nC);void Sort(int X[],int Z[],int n);int main(){ int HAzhishu[N]={0};int HAxishu[N]={...

c语言链表空间分配的问题,邀请诸位高手共析~
接着p->next = s; \/\/把pNode型指针s赋值给p->next。 p = p->next;\/\/看起来没问题。但实际上s中没申请出next的空间,你后面接着构建链表。p->next = s;就是指针p强行访问了没有权限的空间(也就是访问了没申请出来的next空间,即p->next = s)。但是构建出来的是错误的链表。当你free时,系统就从...

怎样更好的理解C++中的链表的使用?
首先,我们把链表的节点比喻成火车的车厢。每节车厢的前面都有一个钩子,我们把这想想成指针,他用来连接上一节车厢。接着,使用尾插法的话,也就是先要找到火车尾,即链表的尾指针。然后把自己要加进去的车厢挂到火车的最后面。最后标记这节车厢为火车尾(把地址赋值给尾指针)。使用头插法的话,...

相似回答
大家正在搜