标题:编写函数删除链表中的结点,函数功能实现不了
只看楼主
mosquiyan
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2014-12-12
结帖率:85.71%
已结贴  问题点数:15 回复次数:7 
编写函数删除链表中的结点,函数功能实现不了
编写insert函数,实现对上述链表结点的插入操作,
编写delete函数,实现通过学号删除结点的操作,编写clear函数,实现对链表的清空操作。
#include "stdio.h"
#include "stdlib.h"
#define STUDENT struct student
#define LEN sizeof(STUDENT)
#define N 3
STUDENT
{
    int num;
    char name[20];
    float score[3];
    STUDENT *next;
};
float avg[N]={0.0};
float *average(STUDENT *head)
{
    STUDENT *p;
    int i=0;
    p=head;
    while(p!=NULL)
    {
        avg[i]=(p->score[0]+p->score[1]+p->score[2])/3;
        p=p->next;
        i++;
    }
    return avg;
}

STUDENT *create(int n)
{
    STUDENT *head,*last,*p;
    int i,j;
    head=last=NULL;
    for(i=0;i<n;i++)
    {
        p=(STUDENT *)malloc(LEN);
        printf("\nplease input%d student's number,name:",i+1);
        scanf("%d,%s",&p->num,&p->name);
        printf("\nplease input score1 score2 score3:");
        for(j=0;j<3;j++)
        scanf("%f",&p->score[j]);
        
        p->next=NULL;
        if(i==0)
          head=last=p;
        else
        {
            last->next=p;
            last=p;
        }
    }
    return head;     
}


void output(STUDENT *head)
{
    STUDENT *p;
    int i=0;
    average(head);
    p=head;
    printf("\nnumber\tname\tscore1\tscore2\tscore3\taverage");
    while(p!=NULL)
    {   
        printf("\n%d\t%-s\t%.1f\t%.1f\t%.1f\t%.2f\n",p->num,p->name,p->score[0],p->score[1],p->score[2],avg[i]);
        p=p->next;
        i++;
    }
}

STUDENT *insert(STUDENT *head,STUDENT *p)
{
    STUDENT *p1,*p2;
    p2=head;
    if(head==NULL)//没有插入点
    {
        p->next=NULL;
        head=p;
    }
    else//有插入点
    {
        while( p2!=NULL&&(p->num > p2->num))//查找插入点
        {
            p1=p2;
            p2=p2->next;
        }
        if(p2==head)//插入点为第一个结点的位置
        {
            p->next=head;
            head=p;
        }
        else//位于中间或末尾
        {
            p->next=p2;
            p1->next=p;
        }     
    }
    return head;
}

STUDENT *delete(STUDENT *head,int num)
{
    STUDENT *p1,*p2;
    p2=head;
    if(head==NULL)//如果链表为空
    {
        printf("\nList is null\n");
        return head;
    }
    p2=head;
    while(num!=p2->num && p2->next!=NULL)//查找删除结点
    {
        p1=p2;
        p2=p2->next;
    }
    if(p2->next!=NULL)//如果不是链表的末尾,即找到了删除结点p2
    {
        if(p2==head)//删除的是第一个结点
           head=p2->next;
        else
           p1->next=p2->next;
        free(p2);
        printf("\ndelete %d successfully",num);
    }
    else
        printf("%d can't be found!",num);
    return head;
}

void clear(STUDENT *head)
{
    STUDENT *p,*p1;
    p=head;
    while(p!=NULL)
    {
        p1=p;
        p=p->next;
        free(p1);
    }
}
main()
{
    STUDENT *head;
    STUDENT *p;
    p=(STUDENT *)malloc(LEN);
    int n,i;
    char c;
    do
    {
        printf("1.input student information\n");
        printf("2.insert student information\n");
        printf("3.delete student information\n");
        printf("4.clear the information\n");
        printf("5.quit\n");
        printf("please choose");
        c=getchar();
        getchar();
        if(c=='1')
        {
            printf("please input the amount of the students:");
            scanf("%d",&n);
            getchar();
            head=create(n);
            output(head);
        }
        else if(c=='2')
        {
            printf("please input the student's number,name:");
            scanf("%d,%s",&p->num,&p->name);
            printf("please input score1 score2 score3:");
            for(i=0;i<3;i++)
            scanf("%f",&p->score[i]);
            insert(head,p);
            printf("the new information is:");
            output(head);   
        }
        else if(c=='3')
        {
            printf("please input the number of the student you want to delete:");
            scanf("%d",n);
            delete(head,n);
            printf("the new information is:");
            output(head);   
        }
        else if(c=='4')
        {
            clear(head);
            //output(head);
        }
        else if(c=='5')
        break;
        getchar();   
    }while(c!='5');
    printf("thank you for using this system!\n");   
}

不知道为什么delete函数老是实现不了,而且运行时无法重复实现insert的功能,不知道哪里出问题了,请大家指点一下O(∩_∩)O
搜索更多相关主题的帖子: average include insert 
2014-12-13 17:18
梦里云归
Rank: 2
等 级:论坛游民
帖 子:17
专家分:12
注 册:2014-9-20
得分:5 
delete是系统函数,不能当做自定义函数用。把delete换成其他不是系统的函数就是了。其它问题你再想想
2014-12-13 21:59
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:5 
你查找都没写对

授人以渔,不授人以鱼。
2014-12-13 22:09
mosquiyan
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2014-12-12
得分:0 
我都是按照课本上的做法来写的里面具体的步骤也不是很理解
2014-12-13 22:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
你要先搞清楚链表的模型,在脑中有清晰的形象,才能写程序。

授人以渔,不授人以鱼。
2014-12-13 23:04
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
几天下来,不知道楼主对链表的模型,理解清楚了没有?

授人以渔,不授人以鱼。
2014-12-16 12:03
我只是个学生
Rank: 3Rank: 3
来 自:中石大
等 级:论坛游侠
威 望:1
帖 子:57
专家分:190
注 册:2014-12-14
得分:5 
链表呀!头疼。

我们的善良将助长一个孩子不劳而获的懒惰心理
2014-12-16 12:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
以下是引用我只是个学生在2014-12-16 12:07:54的发言:

链表呀!头疼。

搞明白了模型,其实也没什么头痛的。

授人以渔,不授人以鱼。
2014-12-16 12:30



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-439903-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.216709 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved