c++运行异常,delet函数出错

vc没有提示错误
Linking...

数据结构实习.exe - 0 error(s), 0 warning(s)
运行到删除函数delet()时出现问题

//建立线性链表,记录和管理某产品参数,管理包括按序号插入、删除、查询

#include<iostream.h>
#include<stdio.h>
#include <stdlib.h>
#define type struct product
#define mum sizeof(type)
//定义链表
typedef struct product
{ int num; // 序号
int data; // 参数
struct product *next;// 指针
struct product *pf,*pb;
}product,*list;

//创建链表
void creatlist(list &head){
int n; //数据个数
cout<<"输入初始数据个数:"<<endl;
cin>>n;
head=(list)malloc(sizeof(product)); //建立带头结点的链表
head->next=NULL;
struct product *pf;
for(int i=1;i<=n;i++)
{ pf=(list)malloc(sizeof(product)); //生成新结点
cout<<"请输入第"<<i<<"个产品的序号及参数"<<endl; //输入元素值
cin>>pf->num>>pf->data;
pf->next=head->next;
head->next=pf;
}//for
}// creatlist

//按序插入某产品信息
void insert(list&head,int num1,int data1){
struct product *pb=head;
while(pb&&pb->num<num1){pb=pb->next;}
struct product *pf;
pf=(list)malloc(mum); //生成新节点
pf->data=data1;
pf->next=pb->next;
pb->next=pf;

}
//按序号查询产品信息(参数)
void search(list&head,int num1,int* e){
struct product *pb=head;
if(num1<0)cout<<"序号不合法!"<<endl;
while (pb->num<num1){pb=pb->next;} //查找位置
*e=pb->data;
}

//删除某一序号的有关记录
void delet(list head,int num1){
type * pb=head;
while(pb&&(pb->num<num1)){pb=pb->next;} //查找位置

if(pb->next==NULL)pb=NULL; //若只有一个节点
else { struct product* pf=pb->next; //若有多个节点
pb->next=pf->next;
free(pb);
}//else
}//delete

//输出所有的结点
void print(type* head){

while(head!=NULL){
cout<<"序号:"<<head->num<<"参数:"<<head->data<<endl;
head=head->next;
}//while
}//print

//////////////////////////验证////////////////////////////////////////////////////////////
void main(){

//创建链表,输出链表//////////////
type*head; int num,data;
creatlist(head);
print(head);

//////////删除//////////////////
cout<<"请输入要删除的产品序号:"<<endl;
cin>>num;
delet(head,num);
print(head);

/////////查询//////////////////
cout<<""<<endl;
cin>>num;
int p;
int* u=&p;
search(head,num,u);
cout<<"序号为"<<num<<"的产品参数为"<<p<<endl;

////////////插入////////////////

cout<<"请输入要添加的序号及参数:"<<endl;
cin>>num>>data;
insert(head,num,data);
print(head);

}
还有输出的也不正常老是多了一组数据,而且数据时随机生成的

改了 print 跟 delet 你看看我改了哪 不懂百度hi最好

void delet(list head,int num1){
type * pb=head->next;
while(pb&&pb->num!=num1)
{
pb=pb->next;
} //查找位置

struct product* temp = head->next;

while(temp->next!=pb)
{
temp = temp->next;
}

if(pb->next==NULL)pb=NULL; //若只有一个节点
else {
struct product* pf=pb->next; //若有多个节点
temp->next=pf;
free(pb);
}//else
}//delete

//输出所有的结点
void print(type* head){

head = head->next;
while(head!=NULL){
cout<<"序号:"<<head->num<<"参数:"<<head->data<<endl;
head=head->next;
}//while
}//print追问

delet函数还是不行,删除不了,老是输出原来的数据,您再帮忙分析一下传参数的问题吧

追答

原来我改了以后就删除中间的可以 我再看看吧

追问

好的,多谢

追答

这次对了 改三个函数 你赋值进去 有问题再问
//创建链表
void creatlist(list &head){
int n; //数据个数
cout>n;
head=(list)malloc(sizeof(product)); //建立带头结点的链表
head->next=NULL;
struct product *pf,*temp;
for(int i=1;i>pf->num>>pf->data;
pf->next = NULL;

if(head->next==NULL)
{
temp=head->next=pf;
}
else
{
temp->next = pf;

temp = pf;
}

}//for
}// creatlist

void delet(list head,int num1){
type * pb=head->next;
while(pb&&pb->num!=num1)
{
pb=pb->next;
} //查找位置

struct product* temp = head->next;

if(temp!=pb)//这里的temp是为了获取到pb的前面一个节点
{
while(temp->next!=pb)
{
temp = temp->next;
}

}
if(head->next==pb)//删除第一个节点的情况
{
head->next = pb->next;
free(pb);
}
else//删除其他节点的情况
{
temp->next=pb->next;

free(pb);

}
}//delete

//输出所有的结点
void print(type* head){

head = head->next;
while(head!=NULL){
coutnumdatanext;
}//while
}//print

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-04-12
你用类的链表,别用结构,这是C语言的做法

c++运行异常,delet函数出错
struct product* temp = head->next;while(temp->next!=pb){ temp = temp->next;} if(pb->next==NULL)pb=NULL; \/\/若只有一个节点 else { struct product* pf=pb->next; \/\/若有多个节点 temp->next=pf;free(pb);}\/\/else }\/\/delete \/\/输出所有的结点 void print(type* head...

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

C++中delet的问题
delet()函数在定义时没有指定命名空间,所以不是book的成员。

C++编写程序将一有序数组多余的元素删除并输出
} printf("Please enter a number what you want to delet:\\n");scanf("%d", &x);if( Delete(a, n, x) == -1 )printf("can not find the number!\\n") ;else { printf("After delet %d:\\n", x);for(i=0; i < n - 1; i++){ printf("%d ", a[i]); \/\/ 不要...

C++怎么用new创建类对象?
假设类名字为 T 使用语法 :T* object = new T(), 其中括号里可以填写类初始化的参数, 得到的 object 是一个T类型的指针,别忘了用delet object 释放内存。当C++程序用new 分配内存的时候,会比C的malloc 做一些额外的工作,尤其是使得类里面使用的STD标准库类型的变量的到合适的初始化。此外,...

c++类编程,设计一个学生类
include "string.h" \/*字符串函数*\/ include "conio.h" \/*屏幕操作函数*\/ include "mem.h" \/*内存操作函数*\/ include "ctype.h" \/*字符操作函数*\/ include "alloc.h" \/*动态地址分配函数*\/ struct score { int mingci;char xuehao[8];char mingzi[20];float score[6]...

怎样C++实现线性表的建立、插入、删除、倒序?
ElemType delet(); void display(); void inverse();\/\/逆转函数};\/\/创建空链表LinkList::LinkList(){ Head=new NodeType; Head->next=NULL; Head->data=0;}LinkList::~LinkList(){ NodeType *p=Head->next; \/\/使指针p指向链表的第一个节点 while(p!=NULL) { Head->next=p->next; \/\/使头指针指...

数据结构作业~急求~~~用c语言或c++ 使用单链表实现系统进程列表,完成...
定义好了链表的结构之后,只要在程序运行的时候爱数据域中存储适当的数据,如有后继结点,则把链域指向其直接后继,若没有,则置为NULL。下面就来看一个建立带表头(若未说明,以下所指链表均带表头)的单链表的完整程序。include <stdio.h> include <malloc.h> \/*包含动态内存分配函数的头文件*...

相似回答
大家正在搜