猿问

求大神知道下,删除功能怎么错了,谢谢

#include<stdio.h>
#include<stdlib.h>
typedef struct xitong
{
    char ID[12];
    char name[7];
    char sex[3];
    int age;
    char profess[11];
    char telephone[12];
    struct xitong *next;
} xi;

void input(xi *head) /*录入人员信息*/
{
    xi *pnew,*px;
    int i=1;
    pnew=head;
    px=head;
    int n;
    printf("  请输入录入人数: ");
    scanf("%d",&n);
    while(i<=n)
    {
        pnew=(xi *)malloc(sizeof(xi));
        printf("\n  *************** 人员信息录入 ******************\n");
        printf("\n  请输入第%d个人员的信息:\n",i);
        printf("\n  姓名:");
        scanf("%s",&pnew->name);
        printf("  学号:");
        scanf("%s",&pnew->ID);
        printf("  性别:");
        scanf("%s",&pnew->sex);
        printf("  年龄:");
        scanf("%d",&pnew->age);
        printf("  专业:");
        scanf("%s",&pnew->profess);
        printf("  电话:");
        scanf("%s",&pnew->telephone);
        px->next=pnew;
        px=pnew;
        i++;
    }
    px->next=NULL;
    printf("\n  输入已完成,请键入1返回菜单: ");
    scanf("%d",&i);
    printf("\n\n\n\n\n\n");

    if(i==1)
        return;

}
void output(xi *head)   /*输出人员信息*/
{
    int i;
    xi *p=head;
    printf("\n  *************** 人员信息输出 ******************\n");
    while(p!=NULL&&p->next!=NULL)
    {
        p=p->next;
        printf("\n  姓名:%s",p->name);
        printf("\n  学号:%s",p->ID);
        printf("\n  性别:%s",p->sex);
        printf("\n  年龄:%d",p->age);
        printf("\n  专业:%s",p->profess);
        printf("\n  电话:%s",p->telephone);
        printf("\n\n\n");
    }
    printf("\n\n  输出已完成,请键入1返回菜单: ");
    scanf("%d",&i);
    printf("\n\n\n\n\n\n");
    if(i==1)
        return;
}
void search(xi *head)   /*查找人员信息*/
{
    int i;
    char ID[11];
    xi *p=head->next;
    printf("\n  *************** 人员信息查找 ******************\n");
    printf("  请输入人员的学号: ");
    scanf("%s",&ID);
    while(p->next!=NULL&&p->ID!=ID)
    {
        p=p->next;
    }
    printf("\n  姓名:%s",p->name);
    printf("\n  学号:%s",p->ID);
    printf("\n  性别:%s",p->sex);
    printf("\n  年龄:%d",p->age);
    printf("\n  专业:%s",p->profess);
    printf("\n  电话:%s",p->telephone);
    printf("\n\n  查找已完成,请键入1返回菜单: ");
    scanf("%d",&i);
    printf("\n\n\n\n\n\n");

    if(i==1)
        return;
}

void change(xi *head)    /*修改人员信息*/
{
    int i;
    xi *p=head->next;
    printf("\n  *************** 人员信息修改 ******************\n");
    printf("  请输入要修改人员的名字: ");
    char name[10];
    scanf("%s",&name);
    while(p->next!=NULL&&p->name!=name)
    {
        p=p->next;
    }

    printf("\n  姓名:");
    scanf("%s",&p->name);
    printf("\n  学号:");
    scanf("%s",&p->ID);
    printf("\n  性别:");
    scanf("%s",&p->sex);
    printf("\n  年龄:");
    scanf("%d",&p->age);
    printf("\n  专业:");
    scanf("%s",&p->profess);
    printf("\n  电话:");
    scanf("%s",&p->telephone);
    printf("\n  输出已完成,请键入1返回菜单: ");
    scanf("%d",&i);
    printf("\n\n\n\n\n\n");

    if(i==1)
        return;


}
void add(xi *head)   /*添加人员信息*/
{
    int i;
    xi *pnew;
    pnew=(xi *)malloc(sizeof(xi));
    printf("\n  *************** 人员信息添加 ******************\n");
    printf("  请输入人员的信息:\n");
    printf("\n  姓名:");
    scanf("%s",&pnew->name);
    printf("\n  学号:");
    scanf("%s",&pnew->ID);
    printf("\n  性别:");
    scanf("%s",&pnew->sex);
    printf("\n  年龄:");
    scanf("%d",&pnew->age);
    printf("\n  专业:");
    scanf("%s",&pnew->profess);
    printf("\n  电话:");
    scanf("%s",&pnew->telephone);
    pnew->next=head->next;
    head->next=pnew;
    printf("\n  输出已完成,请键入1返回菜单: ");
    scanf("%d",&i);
    printf("\n\n\n\n\n\n");

    if(i==1)
        return;
}
void delete()
{
    struct student *p,*q;
    char *sp;
    sp=(char *)malloc(10*sizeof(char));
    printf("所删学生的姓名:");
    scanf("%s",sp);
    fflush(stdin);
    if(first==NULL)
    {
        printf("当前成管为空\n");
        return ;
    }
    if(first!=NULL&&strcmp(first->name,sp)==0)
    {
        q=first;
        first=first->next;
        free(q);
        return ;
    }
    for(p=first,q=p->next; q!=NULL; p=q,q=q->next)
    {
        if(strcmp(q->name,sp)==0)
        {
            p->next=q->next;
            free(q);
        }
    }
    printf("\n     删除成功   \t");
    free(sp);
}
int ui()    /*UI界面*/
{
    int i;
    printf("\n  * * * * * * *实验室人员管理系统* * * * * * **\n");
    printf("  *                                           *\n");
    printf("  *              1.录入人员信息               *\n");
    printf("  *              2.输出人员信息               *\n");
    printf("  *              3.查找人员信息               *\n");
    printf("  *              4.修改人员信息               *\n");
    printf("  *              5.添加人员信息               *\n");
    printf("  *              6.删除人员信息               *\n");
    printf("  *              7.:(  退出系统               *\n");
    printf("  *                                           *\n");
    printf("  * * * * * * * * * * * * * * * * * * * * * * *\n");
    printf("\n  请选择(1-7): ");
    scanf("%d",&i);
    if(i>=0&&i<=7)
        return i;
    else
        return 8;
}
int main()
{
    int i;
    xi *head,*pnew,*px;
    head=(xi *)malloc(sizeof(xi));

    while(1)
    {
        switch(i=ui())
        {
        case 1:
            printf("\n\n");
            input(head);
            break ;
        case 2:
            printf("\n\n");
            output(head);
            break ;
        case 3:
            printf("\n\n");
            search(head);
            break ;
        case 4:
            printf("\n\n");
            change(head);
            break ;
        case 5:
            printf("\n\n");
            add(head);
            break ;
        case 6:
            printf("\n\n");
            delet(head);
            break ;
        case 7:
            printf(" \n\n  :) 感谢使用实验室人员管理系统\n\n\n\n");
            return 0;


        }
    }




}

芡你d太多
浏览 1642回答 1
1回答

Ivoth

写的什么鬼啊链表删除节点可不是你这样 啊q=first;        first=first->next;        free(q);这句话是如果输入的名字匹配链表第一个名字,吧头指针q=first都释放了,也就是没有头节点,其它节点你有没有用其他指针承接, 就是全没了,下面的for循环也是把,匹配到的名字后面的全删了
随时随地看视频慕课网APP
我要回答