① c语言中,头指针,表头指针,头结点,第一结点分别是什么举个例子,谢谢。
头指针是以确定线性表中第一个元素对应的存储位置,一般用于处理数组,链表,队列等数据结构。单链表可以用头指针的名字来命名。单链表中头指针指向头节点。头指针指向上述数据结构的起始数据的指针,如指向数组首地址的指针,指向链表表头节点的指针。
头指针也就是表头指针
在单链表的第一个结点之前附设一个结点(是个结构体),称之为头结点。头结点的数据域可以不存储任何信息,头结点的指针域存储指向第一个结点的指针(即第一个元素结点的存储位置)。头结点的作用是使所有链表(包括空表)的头指针非空,并使对单链表的插入、删除操作不需要区分是否为空表或是否在第一个位置进行,从而与其他位置的插入、删除操作一致。
第一节点,不太清楚,应该是链表有效数据存储的第一个节点吧,就是去除了头结点的第一个节点。
② C语言头插法建立单链表
1. 所谓头指针即为指向链表第一个节点的指针(若链表含有头结点,则指向头结点),该指针变量的值即为链表第一个节点(或头节点)的地址 ,故对于你这段代码来说头指针L存放的是链表第一个元素的地址(因为没有头节点),若要将s所指向的元素要插入到表头,步骤如下:(1)新元素与链表建立连接,(2)断开头指针与链表的连接,(3)头指针指向新的表头(本程序中即s所指的元素).
用代码实现即为:(1)s->next=L(L原先指向第一个元素,现在让新元素与链表建立连接,新元素成为表头元素,原来的表头元素成为链表上的第二个元素,需要将s的链接指针指向原先的表头元素,即把L中原先存储的表头元素的地址赋给s的next指针),(2)(3)L=s(第一步完成了新元素加入链表的操作,若要想新元素作为链表的第一个元素,就要把它的地址赋给头指针L,因为L作为头指针应该始终指向表头元素.这个语句就是实现第二和第三步的:断开头指针与链表的连接,头指针指向新的表头)
2. 如果你对上面的解释能接受的话,那么这一问你应该可以解答了:分析过程就不写了,由头至尾为:5->4->3->2->1
3. 至于这一问,要放到具体的上下文环境中来解释,但无非就是链表的插入,删除操作.可以找相关的资料看一看
诚如一楼所言:这部分刚开始学习时最好画个图,就很容易明白了
你也可以去这看一看:
http://blog.csdn.net/bingwen0210/archive/2007/04/07/1556089.aspx
上面有图.
③ C语言建立带头结点的单链表
单链表的生成有2种方式:头插法和尾插法。
1、头插法
/*********************************************************************
*函数名称:linklist*CreateLinklistHead()
*函数功能:利用头插法创建链表
*参数:无
*返回值:创建完链表后的链表头结点
*说明:无
*********************************************************************/
externlinklist*CreateLinklistHead()
{
intx,i,nodeNum;
linklist*head,*temp;//头结点与临时结点
head=(linklist*)malloc(sizeof(linklist));//生成表头结点
head->next=NULL;//给表头结点的指针域赋值
printf("请输入链表中结点的个数:");
scanf("%d",&nodeNum);
for(i=1;i<=nodeNum;i++)
{
printf("请输入第%d个结点的数据:",i);
scanf("%d",&x);
temp=(linklist*)malloc(sizeof(linklist));//生成新的结点
temp->data=x;//对新结点的数据域赋值
//将新结点插到头结点之后
temp->next=head->next;
head->next=temp;
}
returnhead;//返回新建链表的头结点
}
2、尾插法
/*********************************************************************
*函数名称:linklist*CreateLinklistRear()
*函数功能:利用尾插法创建链表
*参数:无
*返回值:创建完链表后的链表头结点
*说明:无
*********************************************************************/
externlinklist*CreateLinklistRear()
{
intx,i,nodeNum;
linklist*head,*rear,*temp;//定义头结点、尾结点和临时结点
head=(linklist*)malloc(sizeof(linklist));//生成表头结点,表头结点不存放数据
head->next=NULL;//将表头结点的指针域赋值为NULL
rear=head;//将表头结点赋值给表尾结点
printf("请输入链表中结点的个数:");
scanf("%d",&nodeNum);
for(i=1;i<=nodeNum;i++)
{
printf("请输入第%d个结点的数据:",i);
scanf("%d",&x);
temp=(linklist*)malloc(sizeof(linklist));//生成新的结点
temp->data=x;//新增结点的数据域
temp->next=NULL;//新增结点的指针域(由于是尾插法,所以插入的结点都在尾部,即指针域为NULL)
rear->next=temp;//使前一个结点指向新增结点(head->next=temp)
rear=temp;//将新增结点赋值给尾结点(尾插法,插入的结点在尾部)(rear=head->next)
}
//rear->next=NULL;//将尾结点的指针域赋值为空(为了方便检验链表是否为空链表)
returnhead;//返回头结点
}
④ c语言中的单链表的表头,头结点,第一个节点,表尾,尾节点,最后一个节点有什么不同与联系
表头 头结点 第一个节点 表尾 尾节点
带头链表: 头结点 头结点 第一个节点 最后一个节点 最后一个
不带头链表: 第一个 第一个 第一个 最后一个 最后一个
⑤ c语言数据结构单链表(头插入法)
head=(LNode
*)malloc(sizeof(LNode));
这一句不要,没啥用处,除非你head指向的节点也就是第一个节点的data不需要数据
head->next=NULL;这里修改为head=NULL;
让head先指向NULL,也就是没有节点
其实这个可以不要,再主函数中,先让链表是空链表即可(即让head=NULL)
head->data=data;
head->next=p->next;
head->next=p;
关键在这里
你仔细考虑一下,一般来说头插法的head只是一个指针,不要对head指向的那个节点操作,对p操作完成后,让head指过去即可
所以修改为
p->data=data;
//赋值过去,因为你现在申请了p的内存空间
p->next=head;
//把head指向的那个节点连接到p的后面,这样完成头插
//
这是head没有用了,p成为链表的头指针
head=p;
//head再指向这个链表的头部,也就是p指向的节点,为下一次循环做准备
head=Createlist(head);//链表初始化
主函数中这样不太好,建议不要重名
⑥ C语言中的单链表,表头,首元结点有什么区别
按照字面意思理解:表头:单链表的头,一般不存放元素,而存放其他信息例如链表长度等。
首元节点:第一个元素的节点。如果有的单链表没有存放其他信息的表头,那么首元节点就是表头,否则首元节点是表头之后第一个节点。