【问题标题】:Insert an element into a linked list将元素插入到链表中
【发布时间】:2018-08-02 06:05:25
【问题描述】:

如果我有两个定义如下的结构,我如何在列表中插入一个新元素?我尝试了一些东西,但我不知道错误在哪里。插入新元素的函数称为 insertFirst。我主要有lst=insertFirst(lst,7); lst=insertFirst(lst,8); 谢谢!

typedef int DATA;
    struct element {
    DATA cheie;
    struct element *urm;
};
typedef struct element Element, *ELEMENT;

struct lista {
    int nr; //nr elemente
    ELEMENT inceput;
    ELEMENT sfarsit;
};
typedef struct lista Lista, *LISTA;


LISTA insertFirst(LISTA l, DATA x)
{
    LISTA w;
    w = (LISTA)malloc(sizeof(Lista));
    if (w == NULL)return NULL;
    w->inceput=(LISTA)malloc(sizeof(Lista));
    w->inceput->cheie = x;
    w->inceput->urm = l;

    LISTA p = l;
    for (; p->inceput->urm != NULL; p = p->inceput->urm);

    w->sfarsit->cheie = p->inceput->cheie;
    w->sfarsit->urm = NULL;
    return w;
}

【问题讨论】:

  • insertFirst 有一些问题。 w = (LISTA)malloc(sizeof(Lista)); ... w->inceput->cheie = x; ... 这看起来是个问题。你什么时候初始化w->inceput中的指针?我还认为您的insertFirst 需要检查LISTA l 参数是NULL(如果这是插入列表中的第一个元素)。
  • 我没有...但是我是怎么做到的?
  • @ser6131790 inceput 和 sfarsit 在英文中是什么意思?
  • 与分配LISTA 指针的方式相同。使用malloc。或者为他们分配一个已知数据项的地址(不在您的本地堆栈上)。顺便说一句,do not cast the return of malloc.
  • 不要在幕后进行一些未知的更改,只需声明它“工作”即可。这个问题发布不再有任何意义。您的原始发布代码具有定义列表的结构。您的 insertFirst 每次都会创建一个全新的列表,而不是现有列表的新元素。有点不清楚您要在这里做什么。

标签: c list linked-list insert singly-linked-list


【解决方案1】:

看来您的意思如下。那就是你有一个双边单链表。

LISTA insertFirst(LISTA l, DATA x)
{
    ELEMENT w;
    w = (ELEMENT)malloc(sizeof(Element));

    if ( w )
    {
        w->cheie = x;
        w->urm = l->inceput;

        l->inceput = w;
        if ( !l->sfarsit ) l->sfarsit = w;

        ++l->nr;
    }

    return l;
}

定义函数的另一种方式如下

int insertFirst(LISTA l, DATA x)
{
    ELEMENT w;
    w = (ELEMENT)malloc(sizeof(Element));

    int success = w != NULL;

    if ( success )
    {
        w->cheie = x;
        w->urm = l->inceput;

        l->inceput = w;
        if ( !l->sfarsit ) l->sfarsit = w;

        ++l->nr;
    }

    return success;
}

在 main 中,您应该像这样定义列表

Lista l = { 0, NULL, NULL };

这是一个演示程序

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

typedef int DATA;

struct element 
{
    DATA cheie;
    struct element *urm;
};
typedef struct element Element, *ELEMENT;

struct lista 
{
    int nr; //nr elemente
    ELEMENT inceput;
    ELEMENT sfarsit;
};
typedef struct lista Lista, *LISTA;

int insertFirst(LISTA l, DATA x)
{
    ELEMENT w;
    w = (ELEMENT)malloc(sizeof(Element));

    int success = w != NULL;

    if ( success )
    {
        w->cheie = x;
        w->urm = l->inceput;

        l->inceput = w;
        if ( !l->sfarsit ) l->sfarsit = w;

        ++l->nr;
    }

    return success;
}

void outputLista( LISTA l )
{
    printf( "%d: ", l->nr );

    for ( ELEMENT current = l->inceput; current; current = current->urm )
    {
        printf( "%d ", current->cheie );
    }
}

int main(void) 
{
    Lista l = { 0, NULL, NULL };

    insertFirst( &l, 7 );
    insertFirst( &l, 8 );

    outputLista( &l );
    putchar( '\n' );

    return 0;
}

它的输出是

2: 8 7 

至于你的函数实现那么它没有意义。您无需在函数中创建新列表。您需要创建一个新元素并将其插入到列表的当前第一个元素之前。

在列表末尾插入新元素的函数可能如下所示

int insertLast(LISTA l, DATA x)
{
    ELEMENT w;
    w = (ELEMENT)malloc(sizeof(Element));

    int success = w != NULL;

    if ( success )
    {
        w->cheie = x;
        w->urm = NULL;

        if ( l->sfarsit )
        {
            l->sfarsit->urm = w;
        }
        else
        {
            l->inceput = w;
        }

        l->sfarsit = w;

        ++l->nr;
    }

    return success;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多