|  | 
 
| 
void shanchu(stu *p)
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  {
 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)       ;
}
      这个代码花了比较大的力气在键盘输入检测方面,任何时候,如果从键盘获取的参数是空回车,则随时结束输入。 | 
 |