zhangpeile 2016-01-24 12:54 采纳率: 0%
浏览 1656

小白求助: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 2016-01-24 13:21
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!