簡體   English   中英

將元素插入鏈表

[英]Insert an element into a linked list

如果我有兩個定義如下的結構,我如何在列表中插入一個新元素? 我嘗試了一些東西,但我不知道錯誤在哪里。 插入新元素的函數稱為insertFirst。 在主要我有lst=insertFirst(lst,7); lst=insertFirst(lst,8); 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;
}

看來你的意思是以下。 那就是你有一個雙面單鏈表。

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;
}

在主要你應該定義列表

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM