首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

江湖救急菜鸟有关问题@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

2012-03-20 
江湖救急........初学者问题@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#includestdio.h

江湖救急........初学者问题@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include   <stdio.h>
#include   <stdlib.h>

typedef   struct   lnode                             //链表定义...
{  
int   data   ;                                               //数据域..
struct   lnode   *next   ;                           //指针域..

}   lnode   ,   *linklist   ;

int   initlink(linklist   *l)         //新键链表..l为接收链表   ,,k为想插入数的个数..
{
(*l)=(linklist   )malloc(sizeof(lnode));     //开空间....
if(*l==NULL)
return   0;
(*l)-> next=NULL;   //   链表为空....
return   1;


}

int   createlink(linklist   *l)                     //建立链表..       (       算法:是头插法.....)
{
linklist   head=NULL;                               //头指针...
int   i,a;                                                   //i是用来控制输入的个数...
printf( "请输入10个数...\n ");
for(i=0;i <10;i++)
{
(*l)=(linklist   )malloc(sizeof(lnode));                     //用循环开每个接点的空间...
scanf( "%d ",&a);
(*l)-> data=a;                                                           //把输入的元素放到的结点上...                                      
(*l)-> next=head   ;                                              
head=(*l);                                                             //进行每个结点的的连接...

}
return   1;

}


int     linkinsert(linklist   *l,int   i,int   mun)                   //插入操作...
{
linklist   p,s;                                      
int   j=0;
p=(*l);                                                            
s=(linklist   )malloc(sizeof(lnode));             //对插入的那个元素开空间...
if(s==NULL)
return   0;
while(p     &&     j <i-1)                               //查找要插入的位置...
{
p=p-> next;   j++;


}
s-> next=p-> next   ;
p-> next=s   ;                
s-> data=mun;                         //进行插入的操作..
return   1;


}

int   linkdelete(linklist   *l,int   i)                 //
{
linklist   p,q;
p=(*l)   ;
int   j=0   ;
while(p     &&     j <i-2   )
{
p=p-> next;j++;

}
q=p-> next   ;
p-> next=q-> next;
return   1;

}


int   main()
{
linklist   a,j,f;
int   i,k,m;
initlink(&a);
createlink(&a);
printf( "请输入想插入的位置...\n ");    
scanf( "%d ",&i);
printf( "请输入插入的数...\n ");
scanf( "%d ",&k);
linkinsert(&a,i,k);
for(j=a;j;j=j-> next)                       //输入所以的数..
printf( "%5d ",j-> data);
printf( "\n ");
printf( "请输入删除的那个数的位置...\n ");
scanf( "%d ",&m);
linkdelete(&a,m);
for(f=a;f;f=f-> next)
printf( "%5d ",f-> data);
return   1;


}


            这个程序没有错..我要问的问题是...
     
            不是说...链表必要头指针和头结点吗?..(对吗?)
                            我这个程序有头指针...但我认为没有头结点(因为头结点没有数据域,而我这
    每个结点都有数据域...)   .....(对吗??)

          不是说..用头指针找到第一个结点吗??..但我这个程序并没有用头指针找第一个结点啊..
          看我的输出....
      ===========================================================================
                                            for(j=a;j;j=j-> next)                       //输出所以的数..
printf( "%5d ",j-> data);
  =============================================================================
                并没有用头指针找第一个结点啊..但还是输出了每个结点....

              请问这是为什么啊....
 
       

   
           
           




[解决办法]
链表可以有也可以没有头结点,你把有用的数据链在一起,找一个指针指向第一个节点就可以,如果这样则指针指向的第一个节点就是有效的节点。如果你非要加一个头结点也可以,那是头指针指向的节点的下一个节点才是有用的节点。打个比方说,人不戴帽子可以从头数到脚,戴上帽子也可以从头数到脚。帽子就相当于头结点,头就是第一个有效节点。你可以用指针直接指向头,也可以直接指向帽子,只不过如果指向帽子则需要往下指一个才是有用的东西,帽子是无用的。

热点排行