| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5943 人关注过本帖
标题:有关链表(输入输出数据,并删除一个数据)的问题,head=p1和p1=head的区别 ...
只看楼主 加入收藏
弟大勿勃
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
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
#include<stdio.h>
#include<stdlib.h>

#define LEN sizeof(struct student)
struct student *creat();
struct student *del(struct student *head,int num);
int print(struct student *head);
//******************************************//
int n;
//******************************************//
struct student
{
    int num;
   
    float score;
    struct student *next;
};
//******************************************//
int main()
{
    struct student *p,*stu;
    int num;
    stu=creat();
    p=stu;
   
    print(p);
    do
    {
        printf("Please input the num to deleat:");
        scanf("%d",&num);
        print(del(p,num));
    }while(num!=0);
   
    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!=NULL)               
{                                        //
      if(p1->num==num)
    {
        if(p1==head)
        {
            head=p1->next;
            free(p1);
            p1=head->next;
        }
        else
        {
        p2->next=p1->next;
        free(p1);
        p1=p2->next;
        }
        printf("\nDeleat NO:%d succesed!\n",num);
     n=n-1;
    }
   else
      {
        p2=p1;
     p1=p1->next;
   }
}
END:
    return(head);
}

试试是不是你想要的。
2016-09-13 14:51
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 19楼 书生牛犊
之前我一直以为p1=head是让head指向p1这个结点,然后就陷入各种误区了!
您说p1=head是把p1初始化,就是说 struct student *p1 只是定义了一个
指向student的结构体指针,这个指针需要一个初值(即指向具体的数据)
于是p1=head表明p1是指向链表(head),并且p1不一定是指向第一个结点,
而是指向链表的全部结点。这样的话才有后面的head=p1->next和p2->next=p1->next
这样的语句功能实现删除功能。(不知道我说的对不对,哪里有误解请指出)

2016-09-13 15:04
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 23楼 linlulu001
这样编译的结果是删除了多个结点,但每次删除后输出的结果都有一个“0 ”和第一次输入的score的值。
2016-09-13 15:12
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 23楼 linlulu001
其实和while(num!=0)的功能一样,但结果还是有毛病
      {

      }
2016-09-13 15:14
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 23楼 linlulu001
还有head->next ,怎么能这样写啊head不是一个头指针吗?难道它也算一个结点?
2016-09-13 15:16
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
您说p1=head是把p1初始化,就是说 struct student *p1 只是定义了一个     //
指向student的结构体指针,这个指针需要一个初值(即指向具体的数据)        //
于是p1=head表明p1是指向链表(head),                      //到这里为止是对的
并且p1不一定是指向第一个结点,                       //在这道题当中p1=head的时刻,p1就是指向第一个结点,只不过后来不是了
而是指向链表的全部结点。这样的话才有后面的head=p1->next和p2->next=p1->next //这句话有待商榷
这样的语句功能实现删除功能。(不知道我说的对不对,哪里有误解请指出)   
--------------------------------------------
你说p1是指向链表的全部结点,不是特别正确,p1是指针,他有能力指向任何一个地方。他是int*,还是char*或者结构体指针,它本身都只是一个指针,int,char,struct student都是他所指向的那个地址的类型。一个萝卜一个坑,p1只能放下一个地址,所以他只能指向一个结构体,不过这个地址可以变,所以我们通过p1来遍历链表。如果不用p1,我们虽然也能够遍历整个链表,但是遍历玩以后我们不能保证Head本身还能是正确的。就像{int a;int b;}想要交换这两个数就得依赖第三个数字一样。
main(){ int a[10];int *p=a;}
就像a是int a[10]这个数组的地址,也等于a[0]的地址。如果你直接用a++去遍历数组,那么等你遍历完以后,这个数组就已经被搞丢了。而用*p就不一样了。p所指向的位置一直在改变,而a不变啊。他依然是正确的

φ(゜▽゜*)♪
2016-09-13 15:29
弟大勿勃
Rank: 2
等 级:论坛游民
帖 子:186
专家分:59
注 册:2014-4-17
收藏
得分:0 
回复 28楼 书生牛犊
p1=head中p1和head都是指针。既然是指针,那p1和head都有自己的地址,也有自己存储的数据(也是地址)。
p1=head这句的意思,是把head指针的地址(并非它存储的数据)赋值给p1,p1的地址不变,而它里面的值变成
head的地址了(p1指向了head链表了)。是这个意思吗?
收到的鲜花
  • 书生牛犊2016-09-13 17:27 送鲜花  10朵   附言:是的
2016-09-13 15:56
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:5 
do
    {
        printf("Please input the num to deleat:");
        scanf("%d",&num);
        p=del(p,num);
        if(p==NULL) break;
        print(p);
    }while(num!=0);
主函数的循环改成这样;
如果不用do……while(unm!=0),而是用while(num!=0),记得将num初始化或者赋值
2016-09-13 16:16
快速回复:有关链表(输入输出数据,并删除一个数据)的问题,head=p1和p1=head的 ...
数据加载中...
 
   



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

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