‘壹’ 在循环链表中,头指针和链表指针的动态变化决定链表的长度吗
不是,链表的长度确定之后是不可以改变的,当头指针和尾指针动态变化进行插入删除,只可以改变存储链表里元素的个数。
在循环队列中,队头指针和队尾指针的动态变化决定队列的长度。在循环链表中,前一个结点指向后一个结点,而最后一个结点指向头结点,只有头结点是固定的。
线性链表中,由于前一个结点包含下一个结点的指针,尾结点指针为空,要插入或删除元素,只需要改变相应位置的结点指针即可,头指针和尾指针无法决定链表长度。
(1)链表头结点存储链表长度扩展阅读
链表指针的使用
#include<stdio.h>
voidGai(int*m)
{
*m=5;
}
intmain(void)
{
inta=1;
Gai(&a);
printf("%d ",a);
return0;
}
‘贰’ 求单链表的长度
struct node {
int data;
struct node *next;
} ;
创建单链表后,最后一个结点的next是NULL,据此来遍历表,获得长度。
void get_len( struct node *head )
{
struct node *p=head->next ;
int len=0;
while ( p )
{
len++;
p=p->next;
}
head->data=len ; //存储长度到头结点
}
‘叁’ 函数:求有头结点单链表长度
int CreateList(LinkList *head)代码的while循环中,加入了一句话:
if (getchar() == ' ') break; //输入换行时可跳出循环
新写的int getLength(LinkList head)代码如下:
完整代码为:
#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
typedef int ElemType; /*定义表元素的类型*/
typedef struct LNode /*线性表的单链表存储*/
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
/*创建单链表*/
int CreateList(LinkList *head);
/*函数定义*/
int getLength(LinkList head);
/*你的代码将写在此处*/
int CreateList(LinkList *head)
{
LNode *p, *q;
int e;
*head = (LinkList)malloc(sizeof(LNode));
if (!*head)
return ERROR;
(*head)->next = NULL;
p = *head;
while (scanf("%d", &e) == 1)
{
if (getchar() == ' ')
break; // 回车时跳出循环
q = (LNode *)malloc(sizeof(LNode));
if (!q)
return ERROR;
q->data = e;
q->next = NULL;
p->next = q;
p = q;
}
return OK;
}/*CreateList*/
int getLength(LinkList head)
{
LNode *p = head;
int len = 0;
while (p != NULL)
{
++len;
p = p->next;
}
return len;
}
int main()
{
LinkList L = NULL;
CreateList(&L);
printf("%d ", getLength(L));
return 0;
}
gcc编译通过,望采纳~
‘肆’ 链表长度
struct node {
int data;
struct node *next;
} ;
创建单链表后,最后一个结点的next是NULL,据此来遍历表,获得长度。
void get_len( struct node *head )
{
struct node *p=head->next ;
int len=0;
while ( p )
{
len++;
p=p->next;
}
head->data=len ; //存储长度到头结点
}
请采纳答案,支持我一下。
‘伍’ 链表中头结点和开始节点有什么不同
一般而言,链表中的头结点不存放数据,永远在链表物理位置上的第一位,哪怕是空链表也有一个头结点,其目的至少可以简化链表的插入和删除操作
这个开始结点当然指的是第一个有效数据的结点,从逻辑上说,直接链接在头结点后面的那个结点才是
‘陆’ 单链表关于头结点的意义怎么理解不懂,求解释
头结点其实就是一个数据域为空的结点(当然也可储存链表的长度之类的数据,一般对链表操作无影响),而首元结点就是第一个元素结点,即头结点后边的第一个结点。
头结点的存在使得空链表与非空链表的处理操作一致,并且在第一个元素结点前插入结点(或删除第一个结点),其操作与对其它结点一致。
怎么理解上面的话呢?你可想象一下,如果不存在头结点,第一个结点就是实际的第一个数据结点这种结构:对于空链表,每当对其进行添加或删除都要判断是否为空(因为若不为空,就可以直接删除或者添加在尾部或中间);若对其进行插入操作,那么就会出现在第一个元素之前插入的操作方式与插入两个元素之间的操作就不一致(因为第一个元素之前并没有结点,无需用指针指定前驱)。
有了头结点,上面所有这些操作都可以统一的代码实现,无需区分特例。
‘柒’ 求取某带头结点的单链表的长度,请补充完整代码。
{ int i; struct node *p; l1=(List)malloc(sizeof(node)); l1->next=NULL; for(i=0;i<n;i++) { p=(List)malloc(sizeof(node)); scanf("%d",&(p->a)); p->next=l1->next; l1->next=p; } } int getListElem(List l1,int i,int &e) { struct node *p; int j=1; p=l1->next; while(p!=NULL&&j<i) { p=p->next; j++; } if(p==NULL||j>i) return 0; e=p->a; }
‘捌’ 试写一算法在带头结点的单链表结构上实现线性表操作Length(L)。下面各个步骤的解释要详细
intListLength_L(LinkList &L)
{
int i=0;//i存储链表长度,
初始为0
LinkList p=L;//p为链表的指针,
初始为头指针,指向头结点
if(p) p=p-next;//如果p指向的头结点不为空,
p指向带数据的第一个结点
while(p){//如果p非空,i长度加1,且指向下一个结点
p=p->next;
i++;}
return i;
//返回i,即链表的长度
}。
‘玖’ 带表头结点的空循环双向链表的长度等于 0 。
空表自然逻辑长度为0,但是由于有头结点,因此,链表存储中实际有一个结点
‘拾’ JAVA数据结构单链表头结点与尾结点以及计算单链表长度
head就是头结点,也就是第一个节点。
最后一个结点,就是.next = null的节点。