回 帖 发 新 帖 刷新版面

主题:请教各位高手一个关于链表的问题

/* ==================Program Description================== */
/* 程序名称:create.c                                      */
/* 程序目的:建立一个单链表                        */
/* Written By Yang yonghu                          */
/* ========================================================*/  
#include <stdio.h>
#define Max 10                /*定义符号常量Max*/
typedef struct stu            /*结点结构声明*/
{
    int    Number;            /*数据编号*/ 
    char   Name[Max];         /*数据名称*/
    struct stu  *Next;       /*指向后继节点的指针*/
}student;

/*---------------------------------------------------------*/
/*输出链表数据                                             */
/*---------------------------------------------------------*/
void  print(student* Head)
{
     student* Pointer;           /*节点声明*/

     Pointer=Head;           /*将Pointer指针设为首节点*/
     while(Pointer!=NULL)    /*判断链表是否结束,如果结束则结束循环*/
     {
          printf("##Input Data##\n");
          printf("Data Number :%d\n",Pointer->Number);/*向终端输出Pointer节点数据编号数据项的值*/
          printf("Data Name: %s\n",Pointer->Name);    /*向终端输出Pointer节点数据名称数据项的值*/
          Pointer=Pointer->Next;                      /*将Pointer指针指向后继节点*/
     }
}
/*-----------------------------------------------------------------*/
/*建立数据                                                         */
/*-----------------------------------------------------------------*/
student * create()
{
     student * Head;
     int   DataNum;                   /*数据编号*/
     char  DataName[Max];             /*数据名称*/
     student *  New;                       /*节点声明*/
     student *  Pointer;                   /*节点声明*/ 
     int   i;                  

     Head=(student*)malloc(sizeof(student)); /*为首节点分配内存空间*/

     if(Head==NULL)
         printf("Memory allocate  failure!!\n"); /*内存配置失败*/
     else
     {
         DataNum=1;                  /*初始数据编号*/
         printf("Please input the data name(Input 0 to Exit): ");
         scanf("%s",DataName);       /*从终端输入数据名称*/ 
                                
         Head->Number=DataNum;       /*给首节点数据编号数据项赋值*/ 
         for(i=0;i<=Max;i++)             
             Head->Name[i]=DataName[i]; /*给首节点数据名称数据项赋值*/
         Head->Next=NULL;               
        
     Pointer=Head;               /*Pointer指针设为首节点*/

         while(1)
         {
           DataNum++;           /*数据编号递增*/
           New=(student*)malloc(sizeof(student)); /*为新节点分配内存*/
           printf("Please input the data name(Input 0 to Exit): ");
           scanf("%s",DataName);  /*从终端输入数据名称*/ 
           if(DataName[0]=='0')   
             break;              /*输入0结束输入*/
           New->Number=DataNum;   /*给新节点数据编号数据项赋值*/
           for(i=0;i<=Max;i++)
               New->Name[i]=DataName[i]; /*给新节点数据名称数据项赋值*/
           New->Next=NULL;
           Pointer->Next=New;        /*将新节点串联在已有链表的尾端*/
           Pointer=New;          /*将Pointer指针指向新节点,即链表尾端节点为新节点*/
         }  
    
     }
     return Head; 
}
/*---------------------------------------------------------*/
/*主程序                                                   */
/*---------------------------------------------------------*/
main()
{
    student *  H;               /*节点声明*/

    H=create();           /*调用链表创建函数创建链表*/
                       
    if(H!=NULL)
        print(H);     /*调用链表输出函数输出链表数据*/
}

给首节点数据名称数据项赋值 时,为什么要用for循环啊,谢谢大家了

回复列表 (共10个回复)

沙发

您問的問題與鏈表無關,是字符數組的問題。
其實只需要貼:
           for(i=0;i<=Max;i++)
               New->Name[i]=DataName[i]; /*给新节点数据名称数据项赋值*/
就行了。
C/C++語言與其他大部分高級語言不同的是:字符串不屬于內置類型,故取而代之的是字符數組。而C/C++又不支持整數組操作(FORTRAN也沒有字符串類型,但它支持整數組操作)。

所以程序里只能對數組里的元素進行逐項處理。

板凳


那头指针那个不需要了是吗??加上有什么好处吗,谢谢您

3 楼

只有數組需要用循環賦值,而結構里只有一個數組就是:DataName[Max]
所以只有它需要用循環,其他的自然不需要。

沒什么好處壞處一說,這樣做是必須的。

4 楼


再麻烦您一下,其实我要问的是这个
for(i=0;i<=Max;i++)             
   Head->Name[i]=DataName[i];
为什么头指针这块也要循环呢,头指针不就是一个节点嘛? 
for(i=0;i<=Max;i++)
               New->Name[i]=DataName[i]这个循环,我明白了
谢谢您了。。。

5 楼

一樣的意思啊,就是字符數組的賦值嘛。確實跟指針前面的對象無關,只是Name為字符數組。字符數組就需要這樣賦值:)

6 楼

[quote]
再麻烦您一下,其实我要问的是这个
for(i=0;i<=Max;i++)             
   Head->Name[i]=DataName[i];
为什么头指针这块也要循环呢,头指针不就是一个节点嘛? 
for(i=0;i<=Max;i++)
               New->Name[i]=DataName[i]这个循环,我明白了
谢谢您了。。。[/quote]
请楼主恕我直言,以您现在的水平不适合研究这些问题,还是去把基础打好再问,你提的问题根本与链表无关,而且你所谓明白了从你问的问题上看你还是没明白,这个循环只是把一个字符串用数组访问的形式从一块内存复制到另一块内存,如果你想明白这个问题的话还要把数组和指针这章好好学学,如果我没猜错的话这个程序应该是您的学长写的吧,您可以转告他一声,有一个函数叫STRCPY可以完成这个功能。好好打基础吧。

7 楼

[quote][quote]
再麻烦您一下,其实我要问的是这个
for(i=0;i<=Max;i++)             
   Head->Name[i]=DataName[i];
为什么头指针这块也要循环呢,头指针不就是一个节点嘛? 
for(i=0;i<=Max;i++)
               New->Name[i]=DataName[i]这个循环,我明白了
谢谢您了。。。[/quote]
请楼主恕我直言,以您现在的水平不适合研究这些问题,还是去把基础打好再问,你提的问题根本与链表无关,而且你所谓明白了从你问的问题上看你还是没明白,这个循环只是把一个字符串用数组访问的形式从一块内存复制到另一块内存,如果你想明白这个问题的话还要把数组和指针这章好好学学,如果我没猜错的话这个程序应该是您的学长写的吧,您可以转告他一声,有一个函数叫STRCPY可以完成这个功能。好好打基础吧。[/quote]
嗯那,如果允許用庫函數,strncpy也是一個不錯的選擇:)

8 楼


那能麻烦你抽点时间把这个程序用STRCPY做一下吗?太感谢了。谢谢。。。

9 楼


那能麻烦你抽点时间把这个程序用STRCPY做一下吗?太感谢了。谢谢。。。
  

10 楼

for(i=0;i<=Max;i++)
    New->Name[i]=DataName[i]; /*给新节点数据名称数据项赋值*/
改為:
strncpy(New->Name,DataName,Max-1)[Max-1]=0;

同理您可以用相同的方法去改寫:
for(i=0;i<=Max;i++)             
   Head->Name[i]=DataName[i];

結貼吧:)

我来回复

您尚未登录,请登录后再回复。点此登录或注册