Добавление ошибки сегмента списка ADT - PullRequest
0 голосов
/ 07 апреля 2020

Так что я пытаюсь добавить список, но каждый раз, когда я использую функцию добавления, он просто падает (SEG FAULT). Я сузил его примерно до строки, которая указана в значении вставки, и отметил его в приведенном ниже коде.

, так что вот структуры / списки

/*Declration of the struct*/
typedef struct Element {
    value_type value;
    Key_type key;
    struct Element * next;
    struct Element * sort;
}Node;

/*ADT declration*/
typedef struct List {
    Node * head;
    Node * head_sort;
    Node * tail;
    Node * tail_sort;
    int size;
}Sorted_List;

Вот остальная часть кода

/*Fucntion to add values ot the end using tail*/
int append_list (Sorted_List * List, value_type value, Key_type key){
    int result = insert_value(List->tail, value, key) != NULL;
    if ( result == SUCCESS){
        List->size++;
        List->tail = List->tail->sort;

    }

    return result;
}

int append (Sorted_List * List, value_type value, Key_type key){
    return is_empty(List) ? push(List, value, key)
    : append_list(List, value, key);
}

/*Function to insert value into list*/
Node * insert_value (Node * node, value_type value, Key_type key){

    /*Setting a new node and mallocing it */
    Node * new_node = malloc(sizeof(Node));

    /*Checking for the new node to not equal null*/
    if (new_node != NULL){

        /*Setting the values for it*/
        new_node->value = value;
        new_node->key = key;

        /*Setting the new node next to equal old nodes next*/
        new_node->sort = node->sort;

        /*Setting old node next to equal new node*/
        node->sort = new_node;
/////I receive the error around this line^^^^/////

    }

    return new_node;
}

EDIT :: так вот код для функции pu sh, используемой в программе. Задача add front состоит в добавлении значений rot the front, а задача find_prev_gt состоит в том, чтобы найти местоположение преобладающего наибольшего valus. добавить новый номер

/*Function to push a value to to the front of the list*/
int push (Sorted_List * List, value_type value, Key_type key) {
    Node * node = NULL;
    int empty = 0;
    empty = is_empty(List);



Node * next_node = NULL;
    Node * insert_node = find_prev_gt(List->head, key);
    int result = FAILURE;
    if (insert_node == NULL) {
        add_front(&(List->head), value,key);

    }
    else {
        next_node = insert_node->sort;
        if (next_node == NULL || next_node->key != key)
            insert_value(insert_node, value,key);

    }
    result = (node != NULL );
    /*Returns success if reseult is succesfull*/
       if ( result == SUCCESS) {
           List->size++;
          if (empty)
              List->tail = List->head;
       }
    return result;
}


Node * add_front(Node ** head, value_type value, Key_type key){
    Node *new_node = malloc(sizeof(Node));
    if (new_node != NULL) {
        new_node->key = key;
        new_node->value = value;
        new_node->sort = *head;
        *head = new_node;  }
    return new_node;

}

/*Function to check if list is empty*/
int is_empty (Sorted_List * list){
    return list->head == NULL;
}

Node * find_prev_gt ( Node * head, Key_type key ) {
    Node * node = head, * prev = NULL;
    while (node != NULL && node->key < key){
        prev = node;
        node = node->sort;

    }
    return prev;

}

1 Ответ

1 голос
/ 07 апреля 2020

каждый раз, когда я использую функцию добавления, просто происходит сбой

Ваша проблема в функции pu sh, где значение узла не изменяется после его инициализации в NULL, поэтому в

  if ( result == SUCCESS) {
      List->size++;
     if (empty)
         List->tail = List->head;
  }

тест всегда ложен и связанный код не выполняется

Вам просто нужно чтобы изменить две строки, замените строку

add_front(&(List->head), value,key);

на

 node = add_front(&(List->head), value,key);

и строку

insert_value(insert_node, value,key);

by

 node = insert_value(insert_node, value,key);

Если я сделаю эти два изменения и добавлю к твоему коду определения

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

typedef int value_type;
typedef int Key_type;

#define SUCCESS 1
#define FAILURE 0

и добавлю следующее main :

int main()
{
  Sorted_List list = { 0, 0, 0, 0, 0 };
  Node * node;

  append(&list, 2, 22);
  append(&list, 3, 33);
  append(&list, 1, 11);

  for (node = list.head; node != NULL; node = node->sort)
    printf("[key=%d, value=%d] ", node->key, node->value);
  putchar('\n');

  return 0;
}

исполнение пишет:

[key=22, value=2] [key=33, value=3] [key=11, value=1] 

Из этого в Sorted_List ваш код изменения голова и хвост но не head_sort или tail_sort но в Node вы устанавливаете sort , но не next , это не логично, более того, узлы не отсортированы

...