结构体链表-c语言链表,输入输出正确但是删除操作报错

问题描述

c语言链表,输入输出正确但是删除操作报错
#include
#include
#define len sizeof(struct student)

struct student
{int num;
float score;
struct student *next;
};

struct student *creat(void) // 建立
{struct student *p1*p2*head;
int n=0;
p1=p2=(struct student *)malloc(len);
scanf(""%d %f""&p1->num&p1->score);
head=NULL;
while(p1->num!=0)
{n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(struct student *)malloc(len);
scanf(""%d %f""&p1->num&p1->score);

}
p2->next=NULL;
return(head);
}

void print(struct student *head) // 输出
{struct student *p;
p=head;
if(head!=NULL)
for(;p!=NULL;)
{printf(""%d %fn""p->nump->score);
p=p->next;

}}

struct student *del(struct student *headint num) // 删除
{struct student *p1*p2=NULL;

if(head=NULL)
printf(""空链表,无法操作"");
else
{p1=head;
while((num!=p1->num)&&(p1->next!=NULL))
{p2=p1;
p1=p1->next;
}

if(num==p1->num)
{if(p1==head)
head=p1->next;
else
p2->next=p1->next;
free(p1);
printf(""此链表已删除"");
}
else
printf(""无此数据,错误"");
}
return head;

}

main()
{struct student *head*p;
int num;
head=creat();
printf(""输入要查找的数据并删除:n"");
scanf(""%d""&num);
p=del(headnum);
printf(""删除后数据为:"");
print(p);

}

解决方案

崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。

代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

解决方案二:
简单看一眼代码没有运行的情况下.
你的删除方法中条件判断式写错了
if(head=NULL)应该写成if (head == NULL)
如果写成head = NULL表示把head 的值赋为NULL指针这是一个赋值但是它本身是一个TRUE所以你永远只会执行printf(""空链表,无法操作"");
写成head == NULL是正确的这才是判断head指针是否为NULL指针如果是返回TRUE否返回FALSE

解决方案三:
= 是赋值,==是判断

时间: 2024-08-30 17:39:25

结构体链表-c语言链表,输入输出正确但是删除操作报错的相关文章

dll结构体-C#调用DLL结构体,第一次成功,第二次的时候就报错。尝试读取或写入受保护的内存。

问题描述 C#调用DLL结构体,第一次成功,第二次的时候就报错.尝试读取或写入受保护的内存. C++代码 typedef struct tagIDCardData{ char Name[32]; //姓名 char Sex[6]; //性别 char Nation[20]; //名族 char Born[18]; //出生日期 char Address[72]; //住址 char IDCardNo[38]; //身份证号 char GrantDept[32]; //发证机关 char User

实例讲解C语言编程中的结构体对齐_C 语言

Q:关于结构体的对齐,到底遵循什么原则? A:首先先不讨论结构体按多少字节对齐,先看看只以1字节对齐的情况: #include <stdio.h> #include <string.h> #define PRINT_D(intValue) printf(#intValue" is %d\n", (intValue)); #define OFFSET(struct,member) ((char *)&((struct *)0)->member - (

编译器-C语言,编译和链接均未报错,运行时出现异常。

问题描述 C语言,编译和链接均未报错,运行时出现异常. 编译器报告异常信息(http://img.ask.csdn.net/upload/201508/30/1440920346_80190.png) 代码如下 #include #include #include #define TRUE 1 #define FASLE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef struct el

c语言-IAR编译c程序,编译报错:out of memory

问题描述 IAR编译c程序,编译报错:out of memory IAR编译c程序,电脑cpu占用率一下子从30%跑到了99%,接着编译报错:out of memory,难道这对电脑内存也有要求?? 刚用这个编译器,求大神解答 解决方案 你关掉iar,重新打开,或者重启一下电脑,试试. 或者这个可能与你的cpu芯片的分区表有关系,不知道用的什么芯片,芯片内部Flash多大,或者是否用了外部Flash,你的程序的编译结果可能超出了Flash的范围因此报错.

详解C语言中的内存四区模型及结构体对内存的使用_C 语言

内存四区 1.代码区代码区code,程序被操作系统加载到内存的时候,所有的可执行代码都加载到代码区,也叫代码段,这块内存是不可以在运行期间修改的.2.静态区所有的全局变量以及程序中的静态变量都存储到静态区.3.栈区栈stack是一种先进后出的内存结构,所有的自动变量,函数的形参都是由编译器自动放出栈中,当一个自动变量超出其作用域时,自动从栈中弹出.对于自动变量,什么时候入栈,什么时候出栈,是不需要程序控制的,由C语言编译器.实现栈不会很大,一般都是以K为单位的. 当栈空间以满,但还往栈内存压变量

C语言 socket 如何发送带指针的结构体?

问题描述 C语言 socket 如何发送带指针的结构体? 发送一个带指针的结构体,我知道怎么发送? 先把结构体转换成字符串,然后发出.但是接收的时候,怎么接收到结构体中?thanks! 解决方案 发送: struct f;char *ffff[sizeof(f)];memcpy(ffff &f sizeof(f)); 接收: struct f; ffff为收到的数据 memcpy(&f ffff sizeof(ffff)); 解决方案二: C语言---结构体指针C语言--结构体中的指针C语

图片-C语言,请教关于结构体数组的问题

问题描述 C语言,请教关于结构体数组的问题 图中倒数第二行 scanf("%d",&G[i]); 结构体VNode中有两类元素int data 和ArcNode *firstarc 为什么"&G[i]"就是给结构体VNode中的data赋值? 解决方案 &G[i]和&G[i].data的地址相同,有的编译器允许这样使用. 解决方案二: C语言结构体数组赋值问题IOS开发---C语言-?结构体数组C语言中的结构体数组 解决方案三: 我想

c语言-有关结构体及结构体指针的引用

问题描述 有关结构体及结构体指针的引用 (假如结构体 student 里定义了 int double.. 定义了一个结构体指针stu 并且分配了内存 请问输入成员变量时是否内存溢出 以及 读取指针后面内存数据的方式是由编译器控制的吗 解决方案 12321321321321asdasdsdasdsdasdasd21321321313qwasdadasdde2131323 解决方案二: 我的上传资料有几个你可以看一看. 解决方案三: 结构体&&指针c语言结构体自引用指针结构体指针的定义和引用

深入解析C++的WNDCLASS结构体及其在Windows中的应用_C 语言

WNDCLASS是一个由系统支持的结构,用来储存某一类窗口的信息,如ClassStyle,消息处理函数,Icon,Cursor,背景Brush等.也就是说,CreateWindow只是将某个WNDCLASS定义的窗体变成实例.要得到某一窗口的WNDCLASS数据,可以用GetClassLong(); RegisterClass()就是在系统注册某一类型的窗体.也就是将你提供的WNDCLASS数据注册为一个窗口类,在WNDCLASS.lpszClassName中定义该WNDCLASS的标识,无论C