C++删除链表,高手进

#include<iostream>
#include<string>
using namespace std;
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 *p1,*p2;
p1=new book;
head=p1;
p2=p1;
cout<<"请输入图书的编号,以0结束"<<endl;
string str;
cin>>str;
while(!check(str))
{
cout<<"刚才输入的不是数字,请重新输入,按0返回!!!"<<endl;
cin>>str;
}
p1->num=atoi(str.c_str());
if(p1->num!=0)
{
cout<<"请输入图书的价格"<<endl;
cin>>str;
while(!check(str))
{
cout<<"刚才输入的不是数字,请重新输入,按0返回!!!"<<endl;
cin>>str;
}
p1->price=atof(str.c_str());
}
else
{
delete p1;
p2=NULL;
p2->next=NULL;
head=NULL;
return head;
}
while(p1->num!=0)
{
p2=p1;
p1=new book;
cout<<"请输入图书的编号,以0结束"<<endl;
cin>>str;
while(!check(str))
{
cout<<"刚才输入的不是数字,请重新输入,按0返回!!!"<<endl;
cin>>str;
}
p1->num=atoi(str.c_str());
if(p1->num!=0)
{
cout<<"请输入图书的价格"<<endl;
cin>>str;
while(!check(str))
{
cout<<"刚才输入的不是数字,请重新输入,按0返回!!!"<<endl;
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<<"\t";
cout<<"价格:"<<head->price<<endl;
head=head->next;
}
}
void Delete(book *head,int num)
{
book *l;
if(head->num==num)
{
l=head;
head=head->next;
::head=head;
delete l;
cout<<"操作成功"<<endl;
return;
}
while(head)
{
if(head->next==NULL)
{
cout<<"找不到要删除的编号。"<<endl;
return;
}
if(head->next->num==num)
{
l=head->next;
head->next=l->next;
delete l;
cout<<"操作成功"<<endl;
return;
}
head=head->next;
}
cout<<"找不到要删除的编号。"<<endl;
}
int main()
{
book *head=NULL;
head=creat();
showbook(head);
cout<<"请输入要删除的编号:";
int BookNum;
cin>>BookNum;
Delete(head,BookNum);
showbook(head);
return 0;
}

____________________________________________________________

删除中间和最后元素没问题 只有删除头元素出现内存错误

求高手指教

定义了两个head指针,请见量,我自己也很混乱

#include<iostream>
#include<string>
using namespace std;

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 *p1,*p2;
p1=new book;
head=p1;
p2=p1;
cout<<"请输入图书的编号,以0结束"<<endl;
string str;
cin>>str;

while(!check(str))
{
cout<<"刚才输入的不是数字,请重新输入,按0返回!!!"<<endl;
cin>>str;
}

p1->num=atoi(str.c_str());

if(p1->num!=0)
{
cout<<"请输入图书的价格"<<endl;
cin>>str;
while(!check(str))
{
cout<<"刚才输入的不是数字,请重新输入,按0返回!!!"<<endl;
cin>>str;
}
p1->price=atof(str.c_str());
}

else
{
delete p1;
p2=NULL;
p2->next=NULL;
head=NULL;
return head;
}

while(p1->num!=0)
{
p2=p1;
p1=new book;
cout<<"请输入图书的编号,以0结束"<<endl;
cin>>str;

while(!check(str))
{
cout<<"刚才输入的不是数字,请重新输入,按0返回!!!"<<endl;
cin>>str;
}

p1->num=atoi(str.c_str());

if(p1->num!=0)
{

cout<<"请输入图书的价格"<<endl;
cin>>str;

while(!check(str))
{
cout<<"刚才输入的不是数字,请重新输入,按0返回!!!"<<endl;
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<<"\t";
cout<<"价格:"<<head->price<<endl;
head=head->next;
}
}

book* Delete(book *head,int num)
{
book *l,*p;
p=head;
if(head->num==num)
{
l=head;
head=head->next;
//::head=head;这句话没有达到你想要的效果,外面的head没有被修改啊!
printf("%d",head);
delete l;
cout<<"操作成功"<<endl;
return head;
}

while(p)
{
if(p->next==NULL)
{
cout<<"找不到要删除的编号。"<<endl;
return head;
}

if(p->next->num==num)
{
l=p->next;
p->next=l->next;
delete l;
cout<<"操作成功"<<endl;
return head;
}

p=p->next;
}
cout<<"找不到要删除的编号。"<<endl;
}

int main()
{
book *head=NULL;
head=creat();
showbook(head);
cout<<"请输入要删除的编号:";
int BookNum;
cin>>BookNum;
head=Delete(head,BookNum);
showbook(head);
return 0;
}

如果还不明白就发百度过来
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-06-30
其实有些人能帮你,但他并不认为自己是高手,所以看到这个标题,他没有进来,而是翻到了下一个标题。不知道楼主对于高手的定义是什么概念,但是肯定不是所有人对于高手的定义是一样的。而我认为自己是高手,手放的比较高的那种,公司的桌面太高了。没办法,但我看到这么长的代码,直接拖到了网页的底部,然后写下了这段话。望楼主见谅。
第2个回答  2010-06-30
head=head->next;
::head=head;
delete l;
::head此处调用并不能调用到主函数的head,删除l,其实就是把head也删除了
第3个回答  2010-06-30
太长了哦。。。

既然出现内存错误,无非是对NULL指针进行了非法操作造成得

求大神教我c++ 谢啦 是关于链表删除的
include<iostream> using namespace std;struct Node{ int data;Node *next;};Node * ins(Node *head, int x){ Node *p,*q,*t;t=new Node;t->data=x;t->next=0;if(head==0){ head=t;return head;} q=head;p=head->next;while(p!=0){ q=p;p=p->next;} q->next=t;ret...

C++中销毁单链表的问题
{ LNode * p = L; LNode * t; while (p) { t = p->next; delete p; \/\/这里。删除当前p节点,下一步赋值为t(即p->next) p = t; }}

用C++方法实现顺序表线性表的建立、插入、删除和逆转操作。并用主函数...
delete Head;\/\/最后将头节点也删除 cout<<"已经删除链表!"<<endl;} void LinkList::display(){ NodeType *p;p=Head->next;while(p!=NULL){ cout<data<<" ";p=p->next;} cout<<endl;} void LinkList::create() \/\/逆转链表元素 { NodeType *s;ElemType x;cout<<"请输入一组数据...

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

c++释放链表节点是什么意思
因为链表是动态创建,分散在内存的各个地方,通过链表指针访问的.如果不要它了,就要把它的资源释放,而不是简单的断开指针链接(那样会内存泄露).而且如果链表节点上有指向资源的指针,还要先把它释放再释放链表节点本身.释放链表节点是写一个好程序的基础.

【数据结构】C\/C++ 单链表的 创建、初始化、增、删、改、查、遍历等基 ...
C\/C++单链表的基本操作包括创建、初始化、增删改查和遍历等。首先,定义链表结构,包括数据域和指向下一个节点的指针。头插法建立链表函数Creat_LinkList()的工作流程是:动态分配链表节点,输入用户数据,通过循环将节点依次插入到链表头部,直到用户输入0为止。尾插法的创建函数Creat_LinkList_R()则是...

用C++设计一个整型链表类list,能够实现链表结点的插入(insert)、删除...
void insert(int i,int x); void DELETE(int i); void display(); private: node *first,*last; }; void list::push_back(int val) { node *p=new node(val); if(NULL==first) { first=p; last=p; } else { last->R=p; p->L=last; last=last->R; } } void list:...

链表中的怎么使用指针进行链表的建立、插入、删除等处理操作
1、链表建立需要节点。这是存储数据的基础,以C++语言为例,要建立这样的节点(假设存储信息的类型作为一个模板)template <class DataType> struct Node{ DataType info;\/\/节点存储的信息 Node<DataType> *next;};2、因为你是使用指针,那么,就需要动态创建结构体。使用new 运算符在堆内存中创建 Node...

...带头结点的循环链表为list,设计一个算法,删除链表中数据域值为_百度...
已知一个带头节点的循环列表为list设计一个算法,删除链表中数据域值为item的所有结点C++

数据结构作业~急求~~~用c语言或c++ 使用单链表实现系统进程列表,完成...
2、链域或称为指针域:用来存储下一个结点地址或者说指向其直接后继的指针。例:typedef strUCt node { char name[20];struct node *link;}stud;这样就定义了一个单链表的结构,其中char name[20]是一个用来存储姓名的字符型数组,指针*link是一个用来存储其直接后继的指针。定义好了链表的结构...

相似回答