2 zhangpeile zhangpeile 于 2016.01.24 20:54 提问

小白求助:c语言链表头结点无法删除,请各位老师指教,不胜感激.

图片说明
这是运行后的结果

下面是代码,请各位前辈指教,谢谢!

 #include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define len sizeof(struct student)
typedef struct student
{
    char id[10];
    char name[20];
    struct student *next;
}STU;
//分割线的输出
void line()
{
    int i;
    for(i=0;i<30;i++)
    {
        printf("-");
    }
    printf("\n");
}
//新建链表
STU *link(int n)
{
    STU *head,*p,*p1;
    int i=1;
    while(n<=0)
    {
        printf("分配失败,请输入你要录入学生的个数:");
        scanf("%d",&n);
        line();
    }
    head=p=p1=(struct student *)malloc(len);
    printf("请输入第1个学生信息(学号,姓名):\n");
    scanf("%s%s",p1->id,p1->name);
    for(i=2;i<=n;i++)
    {
        p1=(struct student *)malloc(len);
        line();
        printf("请输入%d个学生信息(学号,姓名):\n",i);
        scanf("%s%s",p1->id,p1->name);
        p->next=p1;
        p=p1;
    }
    p1->next=NULL;
    return head;//返回头指针
}
//链表的输出
void output(STU *head)
{
    STU *p=head;
    line();
    if(p!=NULL)
    printf("学号\t姓名\n");
    while(p!=NULL)
    {
        printf("%s\t%s\n",p->id,p->name);
        p=p->next;
    }
}

//链表查找

void find(STU *head,char *name)
{
    STU *p=head;
    while(p!=NULL)
    {
        if (strcmp(p->name,name)==0)
        {
            break;
        }
        p=p->next;
    }
    if(p==NULL)
    {
        line();
        printf("对不起,找不到此学生\n");
    }
    else
    {   line();
        printf("学号\t姓名\n");
        printf("%s\t%s\n",p->id,p->name);
    }
}
//链表的删除
STU *del(STU *head,char *name)
{
    STU *p=head,*front;
    if (strcmp(head->name,name)==0)
    {
        head=head->next;
        return head;
    }
    while(p!=NULL)
    {
        if (strcmp(p->name,name)==0)
        {
            break;
        }
        front=p;
        p=p->next;
    }
    if (p!=NULL)
    {
        front->next=p->next;
    }
    else
    {
        printf("找不到该学生;");
    }
    return head;
}

void main()
{
    STU *head;
    int n;
    char name[20];
    head=NULL;
    printf("请输入你要录入学生的个数:");
    scanf("%d",&n);
    line();
    head=link(n);
    output(head);
/*
    printf("请输入要查找的学生姓名:\n");
    getchar();
    gets(name); 
    output(find(head,name));*/
    line();
    printf("请输入你要删的学生的姓名:\n");
    getchar();
    gets(name);
    del(head,name);
    output(head);
}

2个回答

zhangpeile
zhangpeile   2016.01.24 21:21

问题了已经结束了. 检查发现.忘记接收回删除后的head 还是输出的原来的head

wjwever1
wjwever1   2016.01.24 21:43

你好,倒数第二行改成
head = del(head,name);

图片说明

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!