在链表的开头插入?

时间:2015-04-28 17:19:42

标签: c linked-list

我在尝试将某些元素添加到链接列表时遇到了一些麻烦。我的问题是,尽管代码在函数中添加了“PROCESS”,但是一旦我离开它,“Stiva”就会变空,如果我试图“打印”它的元素,我得到的只是NULL。这是我到目前为止所写的内容,如果有人可以提供帮助我会非常感激,我真的不明白它在哪里无法通过指针传递参数:

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

typedef struct
{
   int prioritate;
   int id;
} TProces;

typedef struct celst
{
   struct celst *urm;
   void *info;
} TCelSt, *TStiva, **TStive;

int Push(TStiva Stiva, int id, int prt)
{
   TStiva StivaNoua;
   TProces proces;
   StivaNoua = (TCelSt*)malloc(sizeof(TCelSt));
   StivaNoua->info = (TProces*)malloc(sizeof(TProces));
   proces.id = id;
   proces.prioritate = prt;
   memcpy(StivaNoua->info, &proces, sizeof(TProces));
   StivaNoua->urm = Stiva;
   Stiva = StivaNoua;
   return 1;
}

int ShowStiva(TStiva Stiva)
{
   TCelSt *aux;
   if(Stiva == NULL) printf("CRY \n");
   for(aux = Stiva; aux!=NULL; aux=aux->urm)
   {
      printf("[%d %d]\n", ((TProces*)(aux->info))->id, ((TProces*)(aux->info))->prioritate );
   }
   return 1;
}

int main()
{
   TStiva Stiva;
   Stiva = NULL;
   Push(Stiva, 5, 8);
   Push(Stiva, 8, 1);
   ShowStiva(Stiva);
   return 0;
}

3 个答案:

答案 0 :(得分:1)

您需要将指针传递给TStiva,如下所示:

int Push(TStiva *Stiva, int id, int prt)
{
    TStiva StivaNoua;
    TProces proces;
    StivaNoua = (TCelSt*)malloc(sizeof(TCelSt));
    StivaNoua->info = (TProces*)malloc(sizeof(TProces));
    proces.id = id;
    proces.prioritate = prt;
    memcpy(StivaNoua->info, &proces,
    sizeof(TProces));
    StivaNoua->urm = *Stiva;
    *Stiva = StivaNoua;
    return 1;
}

因为您正在函数中修改它,并且在main

Push(&Stiva, 8, 1);

答案 1 :(得分:1)

您正在修改Stiva中的输入参数Push,但它只是本地修改。它不会更改main中变量的值。

我的建议:

  1. Push的返回类型更改为TStiva并返回适当的值。
  2. 更改main以使用Push返回的值。
  3. TStiva Push(TStiva Stiva, int id, int prt)
    {
       TStiva StivaNoua;
       TProces proces;
       StivaNoua = (TCelSt*)malloc(sizeof(TCelSt));
       StivaNoua->info = (TProces*)malloc(sizeof(TProces));
       proces.id = id;
       proces.prioritate = prt;
       memcpy(StivaNoua->info, &proces, sizeof(TProces));
       StivaNoua->urm = Stiva;
       Stiva = StivaNoua;
       return Stiva;
    }
    
    
    int main()
    {
       TStiva Stiva = Push(NULL, 5, 8);
       Stiva = Push(Stiva, 8, 1);
       ShowStiva(Stiva);
       return 0;
    }
    

答案 2 :(得分:0)

我不确定我是否了解您的LL实施情况,但这可能会对您有所帮助:

headInserting in a LL