| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 811 人关注过本帖
标题:删除链表,有问题,求指导
只看楼主 加入收藏
chen1204019
Rank: 1
来 自:广东
等 级:新手上路
帖 子:93
专家分:0
注 册:2012-12-3
结帖率:90.63%
收藏
已结贴  问题点数:20 回复次数:17 
删除链表,有问题,求指导
哪里错了,要注意什么?什么思想?
程序代码:
/*
学生信息删除函数,删除指定学号的学生信息,
传递给该函数的实参是所建立的单链表的头指针L、要删除的学生学号。
若删除成功,返回值为1,否则,返回值为0。

 */
#include<stdio.h>
#include<stdlib.h>
#define N 5
struct stud
{
    int num;
    char name[10];
    float score[N+1];
    struct stud *next;
};
struct stud *create();
int Delete(struct stud *head, int * per);
void print(struct stud *head);
//主函数
int main(void)
{
    struct stud *L;
    int n, i;
    L=create();
    printf("请输入要删除学生的学号:\n");
    scanf("%d\n", &n);
    i=Delete(L, &n);
    printf("%d\n", i);
    return 0;
}
//创建链表头,这里也有运行错误
struct stud *create()
{
    struct stud *head,*p1,*p2;
    int n=0, i;
    head = NULL;
    p2 = p1 = (struct stud*)malloc(sizeof(struct stud));
    printf("请输入学号:\n");
    scanf("%d",&p1->num );
    printf("请输入姓名:\n");
    scanf("%s", p1->name);
    if( p1->num == 0 )
    {
        p2->next=NULL;
        return head;
    }
    printf("请输入学生5门成绩:\n");
    for(i=0; i<5; i++)
        scanf("%f",&p1->score[i]);
    while(p1->num != 0)
    {
        n=n+1;
        if(n==1)
            head = p1;
        else
            p2->next = p1;
        p2 = p1;
        p1 = (struct stud*)malloc(sizeof(struct stud));
        printf("请输入学号:\n");
        scanf("%d",&p1->num);
        if( p1->num == 0 )
        {
            p2->next=NULL;
            return head;
        }
        printf("请输入姓名:\n");
        scanf("%s", p1->name);
        printf("请输入5门成绩:\n");
        for(i=0; i<5; i++)
            scanf("%f",&p1->score[i]);
    }
    p2->next =NULL;
    return head;
}
//问题在这里开始
/*
学生信息删除函数,删除指定学号的学生信息,
传递给该函数的实参是所建立的单链表的头指针L、要删除的学生学号。
若删除成功,返回值为1,否则,返回值为0。

 */
int Delete(struct stud *head, int * per)
{
    int y;
    struct stud * p = head;
    struct stud * pa;
    if (head->next == NULL)
    {
        printf("链表为空!!!");
        y=0;
    }
    else
    {
        while(*per != 0 && p->next!=NULL)
        {
            pa=p;
            p=p->next;
        }
        if(*per==0)
        {
            pa->next=p->next;
            y=1;
            free(p);//释放内存
        }
        else
        {
            printf("未找到该数据!\n");
            y=0;
        }
    }
    return y;
}
搜索更多相关主题的帖子: 信息 
2013-01-04 09:44
crystall
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:184
专家分:809
注 册:2012-12-1
收藏
得分:0 
你的意思是根据学号删除,但是在删除的时候你没有与删除的学号做比较。
2013-01-04 10:02
crystall
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:184
专家分:809
注 册:2012-12-1
收藏
得分:0 
程序代码:
int Delete(struct stud *head, int * per)
{
    int y = 0;
    struct stud * p = head;
    struct stud * pa;

    //头节点的下一个结点为空,链表不为空.(有头节点这个元素)
    //如果头节点为空,链表则为空.

    /*
    if (head->next == NULL)
    {
        printf("链表为空!!!");
        y=0;
    }
    */

    if (head == NULL)
    {
        printf("链表为空!!!");
        y=0;
    }
2013-01-04 10:05
crystall
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:184
专家分:809
注 册:2012-12-1
收藏
得分:20 
程序代码:
//保存动态空间地址的变量,最好在释放之后,置为NULL,防止被释放后被访问.

int Delete(struct stud *head, int * per)
{
    int y = 0;
    struct stud * p = head;
    struct stud * pa;

    //头节点的下一个结点为空,链表不为空.(有头节点这个元素)
    //如果头节点为空,链表则为空.

    /*
    if (head->next == NULL)
    {
        printf("链表为空!!!");
        y=0;
    }
    */

    if (head == NULL)
    {
        printf("链表为空!!!");
        y=0;
    }

    else
    {
        while(*per != 0 && p !=NULL)
        {
            if(*per == p->num)
            {
                pa = p;
                p = pa->next;

                free(pa);//释放内存
                pa = NULL;
                y=1;
                break;
            }
            pa=p;
            p=p->next;
        }

        if(*per==0)
        {
            pa->next=p->next;
            y=1;

            free(p);//释放内存
            p = NULL;
        }
       
        if(y == 0)
        {
            printf("未找到该数据!\n");
        }
        else
        {
            printf("已删除\r\n");
        }
    }
    return y;
}
2013-01-04 10:13
crystall
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:184
专家分:809
注 册:2012-12-1
收藏
得分:0 
程序代码:
简单的修改

/*
学生信息删除函数,删除指定学号的学生信息,
传递给该函数的实参是所建立的单链表的头指针L、要删除的学生学号。
若删除成功,返回值为1,否则,返回值为0。
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 5
struct stud
{
    int num;
    char name[10];
    float score[N+1];
    struct stud *next;
};
struct stud *create();
int Delete(struct stud *head, int * per);
void print(struct stud *head);

//主函数
int main(void)
{
    struct stud *L = NULL;
    int n = 0;
    int i = 0;

    //创建
    L = create();

    if(L == NULL)
    {
        printf("创建链表失败\r\n");
    }
    else
    {
        printf("请输入要删除学生的学号:\n");
        scanf("%d", &n);

        i = Delete(L, &n);
        if(i == 1)
        {
            printf("删除成功\n");
        }
        else
        {
            printf("删除失败!\n");
        }
    }
   
    return 0;
}

struct stud *create()
{
    struct stud *head,*p1,*p2;
    int n = 0;
    int i = 0;
    float fScore = 0.0;
   
    head = NULL;
   
    while(true)
    {
        p1 = (struct stud*)malloc(sizeof(struct stud));

        printf("请输入学号:\n");
        scanf("%d",&p1->num );

        if( p1->num == 0 )
        {
            free(p1);  //释放内存
            p1 = NULL;
            break;
        }

        printf("请输入姓名:\n");
        scanf("%s", p1->name);

        printf("请输入学生5门成绩:\n");
        for(i=0; i < 2; i++)
        {
            scanf("%f",&fScore);
            p1->score[i] = fScore;
        }

        //头节点为空间的情况
        if(head == NULL)
        {
            head = p1;
        }
        else
        {
            //从头往后遍历
            p2 = head;
            while(p2->next != NULL)
            {
                p2 = p2->next;
            }

            p2->next = p1;
        }

        p1->next = NULL;
    }

    return head;
}


/*
学生信息删除函数,删除指定学号的学生信息,
传递给该函数的实参是所建立的单链表的头指针L、要删除的学生学号。
若删除成功,返回值为1,否则,返回值为0。
*/
int Delete(struct stud *head, int* per)
{
    int y;
    struct stud * p = head;
    struct stud * pa= NULL;

    if(*per == 0)
    {
        printf("学生的学号不能为0\r\n");
        y=0;
        return y;
    }

    //头节点的下一个结点为空,链表不为空.(有头节点这个元素)
    //如果头节点为空,链表则为空.
    if (head == NULL)
    {
        printf("链表为空!!!");
        y=0;
        return y;
    }
    else
    {
        while(*per != 0 && p !=NULL)
        {
            if(*per == p->num)
            {
                pa = p;
                p = pa->next;

                free(pa);//释放内存
                pa = NULL;
                y=1;
                break;
            }
            pa=p;
            p=p->next;
        }

        if(head->next == NULL)
        {
            y=1;

            free(head);//释放内存
            head = p = NULL;
        }
    }

    return y;
}
2013-01-04 10:32
善ing
Rank: 2
来 自:华东师范
等 级:论坛游民
帖 子:34
专家分:19
注 册:2012-11-18
收藏
得分:0 
回5楼的版主,
程序代码:
 while(*per != 0&& p !=NULL)
{
if(*per == p->num)
{
pa = p;
p = pa->next;

free(pa);//释放内存
pa = NULL;
y=1;
break;
}
pa=p;
p=p->next;
} 

你这里删的时候,好像把链表弄断了,表示不妥。

邂逅c  (⊙o⊙)
2013-01-04 12:07
chen1204019
Rank: 1
来 自:广东
等 级:新手上路
帖 子:93
专家分:0
注 册:2012-12-3
收藏
得分:0 
回复 5楼 crystall
你的代码有错误

新手发言,请多指教!
2013-01-04 21:35
mutouren123
Rank: 1
等 级:新手上路
帖 子:7
专家分:8
注 册:2012-7-5
收藏
得分:0 
单链表么??? 删除的话,分,头  中间  尾部 这三种情况把,分别处理这三种情况就可以了~~~ 头的话,比较简单把~~~
尾部也简单... 中间,要记录上个链表的地址,~~~
不是单链表的话,那就不知道~~~ 那个学号没必要传地址把,直接传 就可以了~~~

分的越细 好像就越简单 ~~~

新人哈...
2013-01-04 22:17
wangjialong
Rank: 2
等 级:论坛游民
帖 子:77
专家分:95
注 册:2012-11-8
收藏
得分:0 
单链表的话中间位置是不是用pa->next=p->next就可以了??

新手发言,请多指教。
2013-01-04 22:57
crystall
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:184
专家分:809
注 册:2012-12-1
收藏
得分:0 
程序代码:
//不好意思,疏忽大意, 重新修改了

int Delete(struct stud *head, int* per)
{
    int y = 0;
    struct stud * pa = head;
    struct stud * pPrev = NULL;


    if(*per == 0)
    {
        printf("学生的学号不能为0\r\n");
        y=0;
        return y;
    }

    //头节点的下一个结点为空,链表不为空.(有头节点这个元素)
    //如果头节点为空,链表则为空.
    if (head == NULL)
    {
        printf("链表为空!!!");
        y=0;
        return y;
    }
    else
    {
        //1 -> [2] -> 3
        while(pa != NULL)
        {
            //找到该学生
            if(*per == pa->num)
            {
                if(pPrev == NULL)
                {
                    free(pa);//释放内存
                    head = pa = NULL;
                }
                else
                {
                    pPrev->next = pa->next;
                    free(pa);//释放内存
                    pa = NULL;
                }

                y = 1;
                break;
            }

            pPrev = pa;
            pa = pa->next;
        }
    }

    return y;
}
2013-01-05 10:16
快速回复:删除链表,有问题,求指导
数据加载中...
 
   



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

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