Создание проблемы узла, любая идея возникает ошибка сегментации? - PullRequest
0 голосов
/ 03 января 2019

Есть идеи, в чем проблема?

Идея:

  1. вставить новый узел вперед в списке ссылок.
  2. создать новый узел
  3. передать адрес функции нового узла, чтобы решить, вставлять ли ему спереди.

спасибо.

struct Node{
    int data;
    struct Node *prev;
    struct Node *next;
}*HEAD, *TAIL;

int main(){
    int temp;
    printf(" |-> Insert front : ");
    scanf("%d", &temp);
    *tempNode = myInsert(temp);
    insertFront(tempNode);
}

Node myInsert(int num){

    // create new node
    Node *newNode = (Node*)malloc(sizeof(Node));
    newNode->data = num;
    newNode->prev = NULL;
    newNode->next = NULL;

    return *newNode;
}

void insertFront(Node *newOne){

    if(HEAD==NULL){
        printf(" |-> insertFront - HEAD : List empty, adding node - %d.\n", newOne->data);
        newOne->prev = newOne;
        HEAD = newOne;
    }
    else{
        // insert front
    printf(" |-> insertFront - List : Adding node - %d.\n", newOne->data);
        newOne->next = HEAD;
        HEAD->prev = newOne;
        HEAD = newOne;
    }
}

[1] 2947 ошибка сегментации ./a.out ОШИБКА: 139

1 Ответ

0 голосов
/ 03 января 2019

Есть несколько проблем в коде, который вы упомянули, во-первых здесь

Node *newNode = (Node*)malloc(sizeof(Node));

что за Node? Вам нужно typedef struct Node. Например,

typedef struct Node{
        int data;
        struct Node *prev;
        struct Node *next;
}Node; /* first typedef it */
Node *HEAD,*TAIL;

Во-вторых, здесь

insertFront(tempNode);

вы передаете tempNode в insertFront() и изменения с tempNode в insertFront() не отражаются в вызывающей функции, поскольку она обрабатывается как вызов по значению. Вам необходимо передать адрес tempNode. например,

insertFront(&tempNode);

Также myInsert() должен возвращать newNode, а не *newNode.

Попробуйте эту версию:

typedef struct Node{
        int data;
        struct Node *prev;
        struct Node *next;
}Node; /* first typedef it */
Node *HEAD,*TAIL;

Node* myInsert(int); /* declaration */
void insertFront(Node **); /* declaration */
void printNode(Node *); /* declaration */
int main(void){
        int temp;
        printf(" |-> Insert front : \n");
        scanf("%d", &temp);
        struct Node *tempNode;
        int itr;
        printf("enter no of nodes you want to insert onto list \n");
        scanf("%d",&itr);
        for(int i = 0;i< itr; i++) {
                tempNode = myInsert(temp);
                insertFront(&tempNode); /* need to pass address else changes in insertFront won't reflect here */
        }
        printNode(tempNode); /* fun for printing Node info*/
        return 0;
}

Node* myInsert(int num){
        // create new node
        Node *newNode = (Node*)malloc(sizeof(Node));
        newNode->data = num;
        newNode->prev = NULL;
        newNode->next = NULL;
        return newNode;
}

void insertFront(Node **newOne){
        if(HEAD==NULL){
                printf(" |-> insertFront - HEAD : List empty, adding node - %d.\n", (*newOne)->data);
                //newOne->prev = newOne; /* not required as myInsert() already did this */
                HEAD = *newOne;
        }
        else{
                // insert front
                printf(" |-> insertFront - List : Adding node - %d.\n", (*newOne)->data);
                (*newOne)->next = HEAD;
                HEAD->prev = (*newOne);
                HEAD = (*newOne);
        }
}
void printNode(Node *temp) {
        while(temp) {
                printf("%d\t",temp->data);
                temp = temp->next;
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...