Нужна помощь в выяснении, почему программа LinkList выдает значение мусора или ошибку доступа к памяти - PullRequest
0 голосов
/ 10 февраля 2020

Я - первый раз, поэтому я не знаю норм, простите, если у меня плохое форматирование.

Я новичок в C программировании и недавно попал в связанные списки, приведенный ниже код был моей дурацкой попыткой сделать один .. Мне было интересно, будет ли кто-нибудь достаточно любезен, чтобы go просмотреть мой код и объяснить, почему я сталкиваюсь с проблемами. Заранее спасибо! Я постараюсь ответить на любые вопросы!

Чтобы объяснить некоторые из моих функций,

  1. createlinklist: просто инициализирует struct linklist и добавляет значение int
  2. addlinkfirst : добавляет узел в конец
  3. removelinklast: удаляет узел с конца
  4. dispalylinklist: печатает содержимое списка ссылок

Код:

#include<stdio.h>

struct linklist {

    int data;
    struct linklist* link;

};

void createlinklist (struct linklist* newlist, int data){

    newlist->data = data;
    newlist->link = NULL;

}

void addlinkfirst (struct linklist* list, int data){

    while(list->link != NULL)
        list = list->link;

    struct linklist *newlist = malloc(sizeof(struct linklist));
    newlist->link = NULL;
    list->link = &newlist;
    newlist->data = data;

}

void removelinklast (struct linklist* list){

    struct linklist* temp;

    while(list != NULL){

        temp = &list;
        list = list-> link;
    }

    temp->data = NULL;
    temp->link = NULL;

}

void displaylinklist (struct linklist* list) {
    printf("\n");

    while(list != NULL){
        printf(" %d-",list->data);
        list = list->link;
    }

    printf("\n");
}

int main () {
    int x = 1, data, x1;
    struct linklist test;

    while(x!=0){
        printf("Press 4 to create, Press 1 insert, Press 2 delete, Press 3 Display, Press 0 to Exit \n");
        scanf("%d",&x);
    //i assume you will be choosing 4 first then the other options 
        switch(x){
            case 4: printf("\nEnter data for the first element:"); scanf("%d",&data); createlinklist(&test,data); break;
            case 1: printf("\nEnter data:"); scanf("%d",&x1); addlinkfirst(&test,x1); break;
            case 2: printf("\nDeleted"); removelinklast(&test); break;
            case 3: displaylinklist(&test); break;
            case 0: break;
            default: printf("Invalid Input Try again\n");
        }
    }

    printf("\nThank you for using my linklist program;");
    return 0;
}

1 Ответ

0 голосов
/ 10 февраля 2020

В основном эта строка:

struct linklist test;

создает узел в стеке, но не инициализирует его. В нем есть неопределенные данные, и, самое главное, член ссылки не равен NULL. Это плохое место для начала.

Возможно, вы захотите начать с указателя, подобного этому:

struct linklist *test = NULL;

Это будет представлять пустой список. Чтобы добавить к нему элемент, вызовите addlink следующим образом: addlink(&test, 42); со следующей реализацией:

void addlink(struct linklist **p_list, int data) {
    if (*p_list == NULL) {
        *p_list = makelist(data);
    }
    else {
        addlink(&(*p_list)->link, data);
    }
}

struct linklist *makelist(int data) {
    struct linklist *list = malloc(sizeof(struct linklist));
    list->link = NULL;
    list->data = data;
    return list;
}

Здесь addlink является рекурсивным, но вы могли бы также легко написать его без рекурсии. В makelist создается список с одним элементом. Я оставлю вам функцию removelist в качестве упражнения, но она также должна принимать аргумент struct linklist ** с двойными указателями, и вы будете называть это так: removelist(&test);.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...