问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

带头结点与不带头结点的单链表的区别?

发布网友 发布时间:2022-06-03 14:31

我来回答

3个回答

热心网友 时间:2023-10-21 16:50

带头结点的单链表和不带头结点的单链表
一、两者区别:

1、不带头结点的单链表对于第一个节点的操作与其他节点不一样,需要特殊处理,这增加了程序的复杂性和出现bug的机会,因此,通常在单链表的开始结点之前附设一个头结点。

2、带头结点的单链表,初始时一定返回的是指向头结点的地址,所以一定要用二维指针,否则将导致内存访问失败或异常。

3、带头结点与不带头结点初始化、插入、删除、输出操作都不样,在遍历输出链表数据时,带头结点的判断条件是while(head->next!=NULL),而不带头结点是while(head!=NULL),虽然头指针可以在初始时设定,但是如1所述,对于特殊情况如只有一个节点会出现问题。

二、为什么不带头结点初始化有2种方式,而带头结点只有1种方式呢?

因为不带头结点声明Node
*head
时;C编译器将其自动初始化为NULL,于是根本不需要调用InitList(head);也即不带头结点的初始化是个伪操作。而带头结点的初始化在堆开辟了一段内存,需要修改head指针变量指向的地址(即head的值),所以要修改head的值,必须传保存head变量的地址(即二维指针)。而直接调用CreatList(head);相当于传head变量的值,函数修改的是head的副本,无法真正改变head的值。 注:这里可以将head指针看成一个变量(不管它保存的是地址),就比较好理解了。

三、其实本质上还是传值,传址的问题,只不过指针本身保存的地址,让这个过程变得有点纠结。在函数调用需要修改指针变量的指向(value)时,应该传递指针变量的地址(address)。

另外,对于函数的形参是指针时,只要该参数不在左边(即都是右值操作),二维指针(形参)就可以简化为一维指针。如上面带头结点的尾插简化版本。

热心网友 时间:2023-10-21 16:50

带头结点的单链表的L指向头结点
不带头结点的单链表的L指向第一个结点

热心网友 时间:2023-10-21 16:51

用实例说明,下面的程序在win-tc和tc2.0下都调试通过,其中tail=tail->next;tail->next=p;(就是生成带头节点的单链表),这两句改成注释中的那两句就会生成不带头结点的单链表,你自己对着程序画一画就明白了。
什么时候要使用带头节点的单链表?为了在第一个数据元素前面加入新元素或者删除第一个节点时头指针的值不变,在第一个数据元素前面要加一个所谓的头节点。
在带头节点的单链表中,头指针(head)只有一个域,即链指针,它指向头节点,头节点有两个域,一个是数据域,值为0(NULL),还有一个域,链指针,这个链指针指向单链表的第一个数据元素。
而在不带头结点的单链表中,头指针也只有一个链指针,但它指向单链表的第一个数据元素。现在你一定明白了吧。
/* 调试通过 */
/* 顺序查表程序 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define NUM 4

struct chain
{
char name[20];
char city[20];
char sex[10];
char age[10];
char job[10];
struct chain *next;
};

struct chain *create();
struct chain *SequelSeach(struct chain *head,char name[]);
void print_data(struct chain *point);

struct chain Datas[NUM]=
{
"Sun","Wuhan","Male","24","student",NULL,
"Tom","Beijing","Male","31","doctor",NULL,
"Marry","Shanghai","Female","19","teacher",NULL,
"Willing","Tianjing","Female","21","worker",NULL
};

int main(void)
{
struct chain *head;
struct chain *p;
char name[30];
head=create();
printf("Please input the name:\n");
scanf("%s",name);
p=SequelSeach(head,name);
print_data(p);
getch();
return 0;
}

struct chain *create()
{
struct chain *head, *tail, *p;
int i;
head=tail=NULL;
printf("Put the datas into the list.\n");
for(i= 0;i < NUM; i++)
{
p=(struct chain *)malloc (sizeof (struct chain));
strcpy(p->name, Datas[i].name);
strcpy(p->city,Datas[i].city);
strcpy(p->sex,Datas[i].sex);
strcpy(p->age,Datas[i].age);
strcpy(p->job,Datas[i].job);
p->next=NULL;
if(head==NULL)
head=tail=p;
else
tail=tail->next; /* 或者tail->next=p; */
tail->next=p; /* 或者tail=p; */
}
return head;
}

struct chain *SequelSeach(struct chain *head, char name[])
/* struct chain *head; */
/* char name[]; */
{
struct chain *temp;
temp=head;
for(temp=head;temp!=NULL;)
{
if(strcmp(temp->name,name)==0)
break;
else
temp=temp->next;
}
if(temp ==NULL)
printf("No Found!\n");
return temp;
}

void print_data(point)
struct chain *point;
{
if(point==NULL)
return;
printf("results:\n");
printf(" name:%s\n",point->name);
printf(" city:%s\n",point->city);
printf(" sex:%s\n",point->sex);
printf(" age:%s\n",point->age);
printf(" profession:%s\n",point->job);
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
倩碧黄油适合哪种肤质的人使用? 倩碧有哪些护肤品比较受女性青睐? 倩碧紧致面霜适合哪些肤质的人使用? 倩碧护肤品适合什么肤质使用? 哪些肤质的人适合使用倩碧卓越润肤乳? 学校发的移动卡,套餐38的送一年宽带 现在卡不想用了,貌似宽带合约没到期... ...我居住浙江,有一个广西的移动卡,移动卡上还捆绑有宽带 我现在在外地我想注销移动卡或者联通卡怎么注销,回不到办卡的地方。 上海最建议去三个景点 为什么叫北京鸭篮球 孕妇饿了能不能吃鸡蛋糕 节气门清洗后,油耗怎么增加了? 清洗过节气门后,油耗为什么变高了 中华人民共和国*的机构有哪些?简单介绍一下(它的主要职责) 支气管扩张能彻底治愈吗 在建筑中行走阅读理解答案 支扩可以手术吗 支扩能吃溥公英吗? 北京四合院说明文阅读及答案 肺癌能吃鸡吗肺癌能吃鸡吗 “会呼吸的建筑”翻译成英文 有支支管扩张病史的人不能吃扩张血管的食物吗 急急急、求救求救。语文阅读题。 支气管扩张能吃什么不能吃什么 支气管扩张吐血,能吃鸡珍和芝麻吗 充满“气泡”的建筑 阅读理解答案 支气管扩张患者能吃鸡肉,牛肉吗 燕云台宫殿里为什么有蒙古包? 支气管扩张病人能吃鸡吗? 中国2010年上海世博会日本馆的展示主题是“像生命体一样会呼吸的建筑”.光合作用与细胞呼吸是植物体内两 什么是无头结点链表 如何创建一个不带头结点的单链表?与带头节点的单链表有什么区别?并且,输出这个单链表? 循环单链表按关键字删除(没有头结点)? 问答题5.解释带头结点的单链表和不带头结点的单链表的区别。 没有头结点的单链表是怎样定义的? 写出在不带头结点的单链表上实现LocateElem(l, x, &i)操作算法。 怎么建立没有头结点和头指针的单循环链表,并且怎么输出?帮我编一下,数据域是整数! 不带头结点的单链表输出? 无头结点的单链表 数据结构,关于不带头结点的单链表问题,求大神们解答,万分感谢,急用,真的很急! 数据结构,不带头结点的单链表判空操作为什么是head=null 不是head-next=null C++中带头结点的单向链表和不带头结点的单向链表各有什么特点和区别 人生如梦下一句 诗句“人生如梦”的下一句是什么 人生如梦,岁月如歌。四季沧桑,无情轮回。的下一句最好写什么? 人生如梦,下一句是什么? 人生如梦下一句什么 为什么中医说吃水果会增加湿气?是否正常? bts为什么叫小包 吃水果会使体内湿气重吗