单链表的头指针和头结点问题??

问题描述

单链表的头指针和头结点问题??

Status InitList(LinkList L)
{ /
操作结果:构造一个空的线性表L /
*L=(LinkList)malloc(sizeof(struct LNode)); /
产生头结点,并使L指向此头结点 /
if(!*L) /
存储分配失败 /
exit(OVERFLOW);
(*L)->next=NULL; /
指针域为空 */
return OK;
}

它是怎么实现将L指向此头结点的???

解决方案

1、L是一个指针变量,那么下面这句就是错误的:
*L=(LinkList)malloc(sizeof(struct LNode));
2、你申请的头结点地址赋给了L, 无法返给调用函数使用

可以修改为:

 Status InitList(LinkList &L)
{ / 操作结果:构造一个空的线性表L /
L=(LinkList)malloc(sizeof(struct LNode)); / 产生头结点,并使L指向此头结点 /
if(L) / 存储分配失败 /
return FALSE;
L->next=NULL; / 指针域为空 */
return OK;
}

解决方案二:

线性链表中的头结点和头指针
头指针和头结点的区别
线性表---单链表(头结点与头指针)

解决方案三:

请问以下这段程序中,head是头指针还是头结点???我一直搞不明白啊

 #include<stdio.h>
#include<stdlib.h>  

typedef struct node
{
    int data;
    struct node *next;
}Linklist;

Linklist *create() //创建链表,带头结点
{
    Linklist *head;
    head = (Linklist *)malloc(sizeof(Linklist));
    head->next = NULL;
    return head;
}

Linklist *tail_insert(Linklist *head, int value) //尾插法
{
    Linklist *p, *t;
    t = head;
    p = (Linklist *)malloc(sizeof(Linklist));
    p->data = value;
    while (t->next != NULL) //当链表不为空时t向后移动
        t = t->next;

    t->next = p;
    p->next = NULL;
    return head;
}

Linklist *display(Linklist *head) //打印链表数据
{
    Linklist *p;
    p = head->next;
    if (p == NULL)
    {
        printf("linklist is empty...
");
        return head;
    }
    while (p != NULL)
    {
        printf("%5d", p->data);
        p = p->next;
    }
    printf("
");
    return head;
}

int main()
{
    Linklist *head;
    int i, num;
    head = create();

    printf("tail_insert:
");
    for (i = 2; i<20; i = i + 4)
        tail_insert(head, i);
    display(head);
    system("pause");
    return 0;
}

解决方案四:

head是头指针,head指向的是头结点,即*head
这个链表的头结点并没有存储数据,也就是说不是有效结点。
它的作用是为了插入、删除结点时处理统一,不需要判断是不是头结点。

时间: 2024-08-04 07:47:15

单链表的头指针和头结点问题??的相关文章

建立空单链表的二级指针寓意何在

问题描述 建立空单链表的二级指针寓意何在 我复习软件技术基础的单链表时,发现一个很费解的地方: 建立一个空的单链表的函数如下所示: void initiatesl(node **h) { *h = (node *)malloc(sizeof(node)); (*h)->next = NULL; 我想问的是,为什么要用二级指针**h,用*h来表达不可以吗? 解决方案 因为调用该函数会传入指针的地址. node *h = NULL; initiatesl(&h); if(h == NULL) {

时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和做法. 如图所示,删除结点 i,那么只需找到 i 的前驱 h,然后连 h 到 j,再销毁i 即可.虽然可以安全的删除 i 结点,但是是顺序查找找到 i,之后删除,时间复杂度是 O(n)级别的.具体做法就是:顺序查找整个单链表,找到要删除结点 i 的直接前驱 h,把 h额 next 指向i 的 nex

数据结构模版----单链表SimpleLinkList[带头结点&amp;&amp;面向对象设计思想](C语言实现)

链表中的数据是以节点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据.以"结点的序列"表示线性表称作线性链表(单链表) 单链表是链式存取的结构,为找第 i 个数据元素,必须先找到第 i-1 个数据元素. [cpp] view plain copy print? #include <stdio.h>   #include <stdlib.h>   #include <

数据结构模版----单链表SimpleLinkList[不带头结点](C语言实现)

下面给出的是单链表不带头结点的另一种实现方式,也是最复杂的一种方式 [cpp] view plain copy print? #include <stdio.h>   #include <stdlib.h>   #include <stdbool.h>   #include <assert.h>      //#define DEBUG             // 调试插桩信息宏      ///*/////////////////////////////

数据结构模版----单链表SimpleLinkList[带头结点](C语言实现)

前面写的单链表结构体是重新设计的.包含头结点(或者头指针)以及链表长度的结构体,而我们通常实现的链表是直接把单链表结点结构体作为单链表来使用的,下面我们给出z这种实现方式,让我们一起来细细体会他们实现之间的区别 [cpp] view plain copy print? #include <stdio.h>   #include <stdlib.h>   #include <stdbool.h>   #include <assert.h>      //#de

数据结构模版----单链表SimpleLinkList[不带头结点&amp;&amp;伪OO](C语言实现)

上一篇写单链表是带头结点的,但是其他这种写法的单链表中,头结点其实就不是那么必要了,因为我们的单链表结构体中增加了一项m_length 下面的不加头结点的单链表奉上 不带头结点的单链表结构体 [cpp] view plain copy print? #include <stdio.h>   #include <stdlib.h>   #include <stdbool.h>   #include <assert.h>            ///*/////

数据结构模版----单链表实现方式总结

数据结构模版----单链表实现方式总结 前面我们提供了四种方式实现的单链表,有带头结点的不带头结点的,而单链表的结构体定义也有两种方式,那么这些实现方式,到底有什么区别呢,为什么会出现这么多种实现方式呢,下面我们就来细细体会 一 单链表结构体的实现区别 首先我们对比一下,单链表结构体 不同方式的单链表实现时,链表结点的实现是相同的,不同之处在于单链表结构体的实现上 单链表结构体的实现 [cpp] view plain copy print? typedef int ElemType;      

防御性编程习惯:求出链表中倒数第 m 个结点的值及其思想的总结

防御性编程习惯 程序员在编写代码的时候,预料有可能出现问题的地方或者点,然后为这些隐患提前制定预防方案或者措施,比如数据库发生异常之后的回滚,打开某些资源之前,判断图片是否存在,网络断开之后的重连次数或者是否连接备用网络,除法运算中的除数问题,函数或者类在接受数据的时候的过滤情况,比如如果输入一个指针参数,是否需要判断是不是空指针?输入一个字符串参数,是否需要判断字符串空否--总的来说就是防止出现不可预见的事情,设计出鲁棒性的代码. 看下面的例子 输入一个链表,输出链表中倒数第 m 个结点额内容

动态单链表的传统存储方式和10种常见操作-C语言实现

顺序线性表的优点:方便存取(随机的),特点是物理位置和逻辑为主都是连续的(相邻).但是也有不足,比如:前面的插入和删除算法,需要移动大量元素,浪费时间,那么链式线性表 (简称链表) 就能解决这个问题.   一般链表的存储方法 一组物理位置任意的存储单元来存放线性表的数据元素,当然物理位置可以连续,也可以不连续,或者离散的分配到内存中的任意位置上都是可以的.故链表的逻辑顺序和物理顺序不一定一样.   因为,链表的逻辑关系和物理关系没有必然联系,那么表示数据元素之间的逻辑映象就要使用指针,每一个存储