Почему этот код C не работает? - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь вставить две случайные строки в каждый узел, но когда я печатаю список, вывод не верен.Что это может быть?Я плохо разбираюсь в памяти, поэтому, если что-то не так, объясните мне.Я также пытался проверить, перезаписывает ли строка другую, но это не так.

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

struct node{
    int times;
    char name[100];
    char number[100];  
    struct node* next;
};

typedef struct node* node;

void mklist(node* n){
    *n=(node)malloc(sizeof(node*));
    (*n)->times=0;
    strcpy((*n)->name,"null");
    strcpy((*n)->number,"null");
    (*n)->next=(node)NULL;
}

void listins_beg(node* n,char name[],char num[],int tim){
    node a;
    a=(node)malloc(sizeof(node));
    if(a==NULL) exit(1);
    a->times=tim;
    strcpy(a->number,num);
    strcpy(a->name,name);
    a->next=(node)(*n);
    (*n)=a;
}

void printlist(node n){
    node x;
    x=n;
    if(x->next==NULL) printf("EMPTY LIST");
    else{
        do{
            printf("%s - %s\n",x->name,x->number);
            x=x->next;
        }while(x->next!=NULL);
    }
}

void freelist(node* n){
    node x;
    for(;x->next!=NULL;(*n)=(*n)->next){
        x=(*n);
        free(x);
    }
}

int main(void){
    node n;
    mklist(&n);
    listins_beg(&n,"Hermanouhuhuuteu","4523-2248",300);
    listins_beg(&n,"Luhu","4523-4887",299);
    listins_beg(&n,"Lulamolute","4523-4687",512);
    printlist(n);
    freelist(&n);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Вы сделали typedef struct node* node в своем коде. Но в своих функциях makelist и listins_beg вы использовали

 *n=(node)malloc(sizeof(node*));
 a=(node)malloc(sizeof(node));

Теперь здесь *n является указателем на struct node, но этовыделение памяти только 8 byte или 4 byte в зависимости от вашей машины, так как sizeof(node*) вернет 8 или 4, потому что node* является pointer to pointer для node, то же самое происходит при выделении памяти для a .Itдолжно быть скорее так

 *n=(node)malloc(sizeof(struct node)); //in makelist
 a=(node)malloc(sizeof(struct node));  //in listins_beg 
0 голосов
/ 25 мая 2018

Во-первых, как указывает ангел, вам нужно избавиться от

  typedef node* node;

Вам необходимо пересмотреть основы работы структур.Например, в main вы объявляете;

    node n;

Затем в mklist (..) вы пытаетесь выделить структуру.Но ваша декларация уже выделила его.Если вы хотите выделить структуры, объявите указатели, затем выделите структуру и установите указатель так, чтобы он указывал на только что выделенную память;

  node *p;
  p = malloc(sizeof(node));
...