江湖救急........初学者问题@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#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);
=============================================================================
并没有用头指针找第一个结点啊..但还是输出了每个结点....
请问这是为什么啊....
[解决办法]
链表可以有也可以没有头结点,你把有用的数据链在一起,找一个指针指向第一个节点就可以,如果这样则指针指向的第一个节点就是有效的节点。如果你非要加一个头结点也可以,那是头指针指向的节点的下一个节点才是有用的节点。打个比方说,人不戴帽子可以从头数到脚,戴上帽子也可以从头数到脚。帽子就相当于头结点,头就是第一个有效节点。你可以用指针直接指向头,也可以直接指向帽子,只不过如果指向帽子则需要往下指一个才是有用的东西,帽子是无用的。