Как реализовать односвязный список в C - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь заполнить свой связанный список в C, но id не говорит, как Я бы хотел. Я хочу сохранить указатель «р» и продолжать добавлять в список с тем же указателем. Однако, когда я пытаюсь распечатать, он печатает только данные головы!

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

 typedef struct{
  int data;
  struct node *next;
}node;

int main(){
   node *head = NULL;
   head =  malloc(sizeof(node));
   if(head==NULL){
     printf("ta foirer quelque chose frero!");
     return 1;
   }
   (*head).data=3;
   (*head).next=NULL;

   node *p = NULL;

  p = (node*) head->next;
  p =  malloc(sizeof(node));
  p->data = 5;

  p->next = NULL;
  p= (node *)p->next;

  int i=0;
  while(i<5){
    p =  malloc(sizeof(node));
    i++;
    p->data = i;
    p->next=NULL;
    p= (node *)p->next;
  }


  p = head;

  while(p){
    printf("\n%d",p->data);
    p =(node*) p->next;
  }

  return 0;
}

Я получаю в качестве вывода

3

и я ожидаю получить

3
5
0
1
2
3
4

1 Ответ

0 голосов
/ 12 апреля 2019
#include<stdio.h>
#include <stdlib.h>

struct Node {
  int data;
  struct Node *next;
};

typedef struct Node node;

void insert(node* h, int v) {
    node* tmp = h;

    while(tmp->next)
        tmp = tmp->next;
    node* newnode = malloc(sizeof(node));
    newnode->data = v;
    newnode->next = NULL;
    tmp->next = newnode;
}

int main(){
   node *head = NULL;
   head =  malloc(sizeof(node));
   if(head==NULL){
     printf("ta foirer quelque chose frero!");
     return 1;
   }
   head->data=3;
   head->next = NULL;


   node *p = NULL;

  insert(head, 5);
  int i=0;
  while(i<5){
    insert(head, i++);
  }


  p = head;

  while(p){
    printf("%d\n",p->data);
    p = p->next;
  }

  return 0;
}

Если вы заметили, я немного изменил компоновку вашего кода и сделал его чище. Вам нужно было пройти, чтобы найти узел , который появляется перед местом , чтобы добавить новый узел , который в данном случае является концом. Обычно это отдельный указатель в другой структуре, содержащей заголовок, который называется tail связанного списка. Вы просто не отслеживали , где , чтобы действительно добавить узел. Эта функция вставки выше делает это.

...