链接列表指针概率

时间:2017-02-24 13:32:27

标签: c

我不知道为什么这不起作用。

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

// struct of list
typedef struct noeud
{
    int adresse, taille, temp;
    struct noeud* suivant;

} * liste;

int random(int a, int b)
{
    return (a + (rand() % ((b + 1) + a)));
}

void initialisation(liste* LBO)
{
    *LBO = NULL;
}

我认为这是我创建q时出现的问题(创建q以指向上一个节点)。

void creation(liste* LBO)
{
    liste q, prec = NULL;
    int i = 0;
    srand(time(NULL));
    while (i < 3)
    {
        printf("%d", i);
        q = malloc(sizeof(liste));

        if (*LBO == NULL)
        {
            q->adresse = 0;
            q->taille = random(5, 45);
            q->temp = random(5, 15);
            q->suivant = *LBO;
            *LBO = q;
            i++;
        }
        else
        {
            prec = *LBO;
            q->taille = random(5, 45);
            q->temp = random(5, 15);
            q->adresse = prec->adresse + prec->taille;
            q->suivant = *LBO;
            *LBO = q;
            i++;
        }
    }
}

void affichage(liste LBO)
{
    printf("\nvoici ta liste \n ");
    while (LBO != NULL)
    {
        printf("%d-->", LBO->taille);
        LBO = LBO->suivant;
    }
    if (LBO == NULL)
        printf("NULL");
}

int main()
{
    // or here
    printf("Hello world!\n");
    liste LBO;
    initialisation(&LBO);

    creation(&LBO);

    affichage(LBO);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

有几个问题:

而不是打电话

 initialisation(&LBO);

这不是真的错,只写:

LBO = NULL;

然后不要隐藏typedef s的指针,只会增加混乱。

而不是:

typedef struct noeud
{
  int adresse, taille, temp;
  struct noeud* suivant;

} *liste;

写:

struct noeud
{
  int adresse, taille, temp;
  struct noeud* suivant;    
};

并使用struct noeud*代替liste

现在真正的问题:

这是错误的。这里为指针分配大小,但需要为整个结构分配大小:

q = malloc(sizeof(liste));

实际上与:

相同
q = malloc(sizeof(struct noeud*))

但你需要:

q = malloc(sizeof(struct noeud))

你现在看到为什么用typedef隐藏指针是一个坏主意。

所以这是您的程序的更正版本(为了简洁省略#include):

struct noeud
{
  int adresse, taille, temp;
  struct noeud* suivant;
};

int random(int a, int b)
{
  return (a + (rand() % ((b + 1) + a)));
}

void creation(struct noeud** LBO)
{
  struct noeud* q, *prec = NULL;
  int i = 0;
  // srand(time(NULL));  <<<<< don't call srand here, call it once at the 
                            // beginning of the program
  while (i < 3)
  {
    printf("%d", i);
    q = malloc(sizeof(struct noeud));

    if (*LBO == NULL)
    {
      q->adresse = 0;
      q->taille = random(5, 45);
      q->temp = random(5, 15);
      q->suivant = *LBO;
      *LBO = q;
      i++;
    }
    else
    {
      prec = *LBO;
      q->taille = random(5, 45);
      q->temp = random(5, 15);
      q->adresse = prec->adresse + prec->taille;
      q->suivant = *LBO;
      *LBO = q;
      i++;
    }
  }
}

void affichage(struct noeud* LBO)
{
  printf("\nvoici ta struct noeud* \n ");
  while (LBO != NULL)
  {
    printf("%d-->", LBO->taille);
    LBO = LBO->suivant;
  }
  // if (LBO == NULL)  <<<<<<<<<<< drop this, LBO is always NULL here
                                // but it doesn't hurt, it's just useless
    printf("NULL");
}

int main()
{
  srand(time(NULL));   // <<<<<<<<<<<<< call srand here
  struct noeud* LBO;
  LBO = NULL;

  creation(&LBO);

  affichage(LBO);
  return 0;
}

仍有改进的余地,尤其是creation功能有点尴尬。

另请查看<<<<<<<<<<<的评论,有一些小修正