|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
void shanchu(stu *p)
{
int i;
printf("请输入删除学生的学号\n");
scanf("%d",&i);
stu * temp =p;
p=p->pnext;
while (p != NULL)
{
if(p->num==i)
{
temp->pnext= p->pnext;
free(p);
p=temp->pnext;//上面的P已经被free掉了,再赋值是不是需要重新定义类型??
}
temp=temp->pnext;
p=p->pnext;
}
p已经被free相当于p的函数已经释放,下面这一步是不是有问题
本帖最后由 jackz007 于 2019-9-23 00:17 编辑
这是我系统地为你修改的代码,新增加了几个函数,你测试一下,看看能否解决你的问题。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- typedef struct student {
- int num ;
- char name[20] ;
- struct student * pnext ;
- } stu ;
- int strip(char * s)
- {
- int b , k , m ;
- m = strlen(s) ;
- while(m > 0 && (s[m - 1] == 0x07 || s[m - 1] == 0x0a || s[m - 1] == 0x0d || s[m - 1] == 0x20)) {
- s[m - 1] = 0x00 ;
- m -- ;
- }
- if(m > 0) {
- b = 0 ;
- while(b < m && (s[b] == 0x07 || s[b] == 0x0a || s[b] == 0x0d || s[b] == 0x20)) b ++ ;
- if(b > 0 && b < m) {
- for(k = b ; k < m ; k ++) s[k - b] = s[k] ;
- s[m - b] = 0x00 ;
- m -= b ;
- }
- }
- return m ;
- }
- int getnum(int * num)
- {
- int m , ret ;
- char s[260] ;
- ret = 0 ;
- * num = ret ;
- for(;;) {
- printf("输入学号 : ") ;
- fgets(s , 256 , stdin) ;
- if(strip(s)) {
- if(sscanf(s , "%d" , & m) == 1) {
- ret = m ;
- * num = ret ;
- break ;
- } else {
- fprintf(stderr , "输入错误!\n\n") ;
- }
- } else {
- break ;
- }
- }
- return ret ;
- }
- char * getname(char * name)
- {
- char s[260] , * ret ;
- name[0] = '\0' ;
- ret = name ;
- printf("输入姓名 : ") ;
- fgets(s , 256 , stdin) ;
- if(strip(s)) strcpy(name , s) ;
- return ret ;
- }
- stu * findnode(int num , stu * p)
- {
- stu * ret ;
- ret = NULL ;
- while(p) {
- if(p -> num == num) {
- ret = p ;
- break ;
- } else {
- p = p -> pnext ;
- }
- }
- return ret ;
- }
- stu * addnode(stu * p)
- {
- int num ;
- stu * h , * q ;
- char name[20] ;
- bool f ;
- f = true ;
- h = p ;
- printf("\n") ;
- printf("*** 录入学员信息 ***\n") ;
- for(; f ;) {
- p = h ;
- printf("\n") ;
- if(getnum(& num)) {
- if(! findnode(num , p)) {
- if(strlen(getname(name))) {
- q = (stu *) malloc(sizeof(stu)) ;
- q -> num = num ;
- strcpy(q -> name , name) ;
- q -> pnext = NULL ;
- if(p) {
- while(p -> pnext) p = p -> pnext ;
- p -> pnext = q ;
- } else {
- p = q ;
- h = p ;
- }
- } else {
- f = false ;
- }
- } else {
- fprintf(stderr , "错误:节点已经存在!\n\n") ;
- }
- } else {
- f = false ;
- }
- }
- return h ;
- }
- stu * delnode(stu * p)
- {
- int num ;
- stu * h , * q ;
- bool f ;
- f = true ;
- printf("\n") ;
- printf("*** 删除学员信息 ***\n") ;
- h = p ;
- if(p) {
- for(; f ;) {
- if(h) {
- p = h ;
- printf("\n") ;
- if(getnum(& num)) {
- if((q = findnode(num , p))) {
- while(p != q && p -> pnext && p -> pnext != q) p = p -> pnext ;
- if(p == q || p -> pnext == q) {
- if(p == q) h = p -> pnext ;
- else p -> pnext = q -> pnext ;
- free(q) ;
- }
- } else {
- fprintf(stderr , "错误:节点未找到!\n\n") ;
- }
- } else {
- f = false ;
- }
- } else {
- printf("\n") ;
- printf("链表节点已经全部删除!\n\n") ;
- f = false ;
- }
- }
- } else {
- fprintf(stderr , "错误:链表为空!\n\n") ;
- }
- return h ;
- }
- void print(stu * p)
- {
- printf("\n") ;
- printf("*** 显示学员信息 ***\n") ;
- if(p) {
- while(p) {
- printf("%d\t%s\n" , p -> num , p -> name) ;
- p = p -> pnext ;
- }
- } else {
- fprintf(stderr , "错误:链表为空!\n\n") ;
- }
- }
- int main(void)
- {
- stu * p ;
- p = NULL ;
- p = addnode(p) ;
- print(p) ;
- p = delnode(p) ;
- print(p) ;
- }
复制代码
这个代码花了比较大的力气在键盘输入检测方面,任何时候,如果从键盘获取的参数是空回车,则随时结束输入。
|
|