标题:创建链表两个指针看不懂,pEnd与pNew
只看楼主
ycyu1455
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2016-4-3
结帖率:33.33%
已结贴  问题点数:20 回复次数:14 
创建链表两个指针看不懂,pEnd与pNew
struct Student* Create()                        
{
    struct Student* pHead=NULL;                    
    struct Student* pEnd,*pNew;                    
    iCount=0;                           
    pEnd=pNew=(struct Student*)malloc(sizeof(struct Student));   
    printf("please first enter Name ,then Number\n");
    scanf("%s",&pNew->cName);                    
    scanf("%d",&pNew->iNumber);                    
    while(pNew->iNumber!=0)
    {
        iCount++;                        
        if(iCount==1)                        
        {
            pNew->pNext=pHead;               
            pEnd=pNew;                    
            pHead=pNew;                    
        }
        else                           
        {
            pNew->pNext=NULL;               
            pEnd->pNext=pNew;               
            pEnd=pNew;
        }
        pNew=(struct Student*)malloc(sizeof(struct Student));   
        scanf("%s",&pNew->cName);
        scanf("%d",&pNew->iNumber);
    }
    free(pNew);                           
    return pHead;
}

//pEnd与pNew从pEnd=pNew=(struct Student*)malloc(sizeof(struct Student))中不是得到同一块内存的地址吗,操作任意一个指针变量等于操作一块内存,我感觉就是拿着一个地址穿来穿去,就被掉包了,就好像两个指针变量的指向变成了指向不同内存了,绕晕了
搜索更多相关主题的帖子: Create please 
2016-07-13 14:21
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
得分:0 
程序代码:
struct Student* Create()                        

 {
     struct Student* pHead=NULL;                    
     struct Student* pEnd,*pNew;                    
     iCount=0;                            
     pEnd=pNew=(struct Student*)malloc(sizeof(struct Student));    
     printf("please first enter Name ,then Number\n");
     scanf("%s",&pNew->cName);                    
     scanf("%d",&pNew->iNumber);                    
     while(pNew->iNumber!=0)
     {
         iCount++;                        
         if(iCount==1)                        
         {
             pNew->pNext=pHead;                
             pEnd=pNew;                    
             pHead=pNew;                    
         }
         else                            
         {
             pNew->pNext=NULL;                
             pEnd->pNext=pNew;                //然后把pEnd的尾指针指向pNew,串起来就是pEnd--pNew--NULL
             pEnd=pNew;                        //pNew给pEnd,这样下次再接下一个链条时,就直接在pNew后面接,串起来pEnd--pNew1--pNew2......--NULL
         }
         pNew=(struct Student*)malloc(sizeof(struct Student));    //这里给pNew重新申请内存了。
         scanf("%s",&pNew->cName);
         scanf("%d",&pNew->iNumber);
     }
     free(pNew);                            
     return pHead;

 }
2016-07-13 14:27
ycyu1455
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2016-4-3
得分:0 
回复 2楼 grmmylbs
程序代码:
struct Student* Create()                        

 {
     struct Student* pHead=NULL;                    
     struct Student* pEnd,*pNew;                    
     iCount=0;                            
     pEnd=pNew=(struct Student*)malloc(sizeof(struct Student));    
     printf("please first enter Name ,then Number\n");
     scanf("%s",&pNew->cName);                    
     scanf("%d",&pNew->iNumber);                    
     while(pNew->iNumber!=0)
     {
         iCount++;                        
         if(iCount==1)                        
         {
             pNew->pNext=pHead;                
             pEnd=pNew;               //这里pEnd与pNew的存储值应该是同一个地址呀,为什么又重新取值
             pHead=pNew;              //然后这里pHead也应该是取pEnd与pNew的存储值,就是那个内存地址,我觉得就是在传递相同的地址,毫无意义的操作,是我哪理解错了?
         }
         else                            
         {
             pNew->pNext=NULL;                
             pEnd->pNext=pNew;               
             pEnd=pNew;                      
         }
         pNew=(struct Student*)malloc(sizeof(struct Student));    
         scanf("%s",&pNew->cName);
         scanf("%d",&pNew->iNumber);
     }
     free(pNew);                            
     return pHead;

 }


[此贴子已经被作者于2016-7-13 17:37编辑过]

2016-07-13 17:34
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
得分:0 
pHead在这里是为了保存最初的链表,也就是表头,因为后面pEnd和pNew的地址都变了,往后移了
2016-07-13 17:40
ycyu1455
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2016-4-3
得分:0 
回复 4楼 grmmylbs
看不懂创建链表第一个节点时的指针变量,两个指针变量存储的地址值我觉得是相同的地址,pNew->pNext与这个pEnd->pNext应该是操作同一块内存中的pNext呀,为什么pNew->pNext=NULL后,还需要pEnd=pNew

难道pEnd与pNew在(struct Student*)malloc(sizeof(struct Student))中取得不是内存地址,而是表示两块同等大小的内存?

[此贴子已经被作者于2016-7-13 17:55编辑过]

2016-07-13 17:51
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
得分:10 
[quote]以下是引用ycyu1455在2016-7-13 17:34:32的发言:
                     
         if(iCount==1)                        
         {
             pNew->pNext=pHead;           //这句其实是为pNew->pNext赋值NULL。   
             pEnd=pNew;               //这里pEnd与pNew的存储值应该是同一个地址呀,为什么又重新取值。
             pHead=pNew;              //然后这里pHead也应该是取pEnd与pNew的存储值,就是那个内存地址,我觉得就是在传递相同的地址,毫无意义的操作,是我哪理解错了?
 pEnd=pNew;               //可有可无的一步。
pHead=pNew   很关键的一步,如果没有这一步,链表在那你都找不到。

[此贴子已经被作者于2016-7-13 17:56编辑过]

2016-07-13 17:54
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
得分:0 
这个确实没必要。
2016-07-13 17:54
ycyu1455
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2016-4-3
得分:0 
回复 7楼 grmmylbs
书籍的注释是:跟踪新加入的节点
2016-07-13 17:56
ycyu1455
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2016-4-3
得分:0 
回复 6楼 linlulu001
pEnd=pNew; 这个是多余的?
2016-07-13 17:57
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
得分:0 
iCount==1的时候还没有新节点
2016-07-13 17:58



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




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

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