| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6013 人关注过本帖
标题:有关链表(输入输出数据,并删除一个数据)的问题,head=p1和p1=head的区别 ...
取消只看楼主 加入收藏
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
结帖率:81.82%
收藏
已结贴  问题点数:10 回复次数:18 
有关链表(输入输出数据,并删除一个数据)的问题,head=p1和p1=head的区别?
程序代码:
#include<stdio.h>
#include<stdlib.h>

#define LEN sizeof(struct student)
struct student *creat();
struct student *del();
int print();
//******************************************//
int n;
//******************************************//
struct student
{
    int num;
    
    float score;
    struct student *next;
};
//******************************************//
int main()
{
    struct student *p,*stu;
    int n;
    stu=creat();
    p=stu;
    
    print(p);
    printf("Please input the num to deleat:");
    scanf("%d",&n);
    print(del(p,n));
    
    printf("\n\n");
   system("pause");
    
}

//******************************************//
struct student *creat()
{
    struct student *head,*p1,*p2;
    p1=p2=(struct student*) malloc(LEN); 
    printf("input the num: ");
    scanf("%d",&p1->num);
    printf("input the score: ");
    scanf("%f",&p1->score);
    head=NULL;
    n=0;
    while(p1->num!=0)
    {
        n++;
        if(n==1)
        {
            head=p1;                    //head指向p1
        }
        else
        {
        p2->next=p1;                        //p2指向p1
        }
        p2=p1;                              //除去p1,让p2代替p1
        p1=(struct student *)malloc(LEN);    //重新输入一个p1
        printf("input the num: ");
        scanf("%d",&p1->num);
        printf("input the score: ");
        scanf("%f",&p1->score);
    }
    p2->next=NULL;                                //p1   
    return head;
    
}
//******************************************//
int print(struct student *head)
{
    struct student *p;
    printf("There are %d records\n",n);
    printf("\t\tnumber\t\tscore\n");
    p=head;
    while(p!=NULL)
    {
        printf("\t\t%d\t\t%.2f\n",p->num,p->score);
        p=p->next;
    }
}
//******************************************//
struct student *del(struct student *head,int num)
{
    struct student *p1,*p2;
    if(head==NULL)
    {
        printf("\nThis list is null!\n");
        goto END;
    }
    p1=head;                                     //为什么这里是p1指向head而不是head指向p1             
    while(p1->num!=num && p1->next!=NULL)               
    {
        p2=p1;                                         //
        p1=p1->next;                                //
    }
    if(p1->num==num)
    {
        if(p1==head)
        {
            head=p1->next;
        }
        else
        {
        p2->next=p1->next;
        }
        printf("\nDeleat NO:%d succesed!\n",num);
        n=n-1;
    
    }
    else
    {
        printf("%d not been found!\n",num);
    }
END:
    return(head);
}

2016-09-12 13:57
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
上面注释里有我想问的问题,请大神看看指导一下!
2016-09-12 13:59
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 3楼 linlulu001
奥,这样啊,就是说让p1指向一个非空链表!那它下面那句:while(p1->num!=num && p1->next!=NULL)               
                                                      {
                                               p2=p1;
                                               p1=p1->next;
                                                   }  
是干嘛的啊?和删除一个数据有什么关系吗?难道仅仅是为了让p2和p1产生关系?
2016-09-12 14:12
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 6楼 linlulu001
那我想删除多个结构体的话,在主函数中怎样重复调用del函数?难道用while循环?或者用什么方法能更智能点。
2016-09-12 14:51
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 9楼 linlulu001
谢谢啊!但是我为什么用你给的代码不能实现同时删除多个结构体的功能啊?
2016-09-12 15:38
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 9楼 linlulu001
还是不会编写删除多个结构体的语句啊,自己编的每次循环都只能删除一个结构体,好悲哀!
2016-09-12 16:05
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 12楼 linlulu001
不行啊,直接是调试错误!那个在主函数中循环调用del函数的方法怎么实现呢?我调用后每次链表都会初始化,就总是只能删除一个结构体,求解决我神!
2016-09-12 16:38
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 15楼 linlulu001
谢版主,不过今晚回去晚了,明天再好好看看你们的见解。不会的还得多问您啊!
2016-09-12 21:58
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 15楼 linlulu001
亲测,还是不行。只能删除一个结点。
我用您给的del函数并在主函数加了个while循环,可以实现多次删除,但结果还是有问题。
程序代码:
int main()
{
    struct student *p,*stu;
    int num;
    stu=creat();
    p=stu;
    
    print(p);
    while(num!=0)
    {
    printf("Please input the num to deleat:");
    scanf("%d",&num);
    print(del(p,num));
    
    printf("\n\n");
   system("pause");
    }
}
2016-09-13 14:45
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 17楼 ehszt
我神,你的代码我加进去编出来的结果也不行 啊?
2016-09-13 14:47
快速回复:有关链表(输入输出数据,并删除一个数据)的问题,head=p1和p1=head的 ...
数据加载中...
 
   



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

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