Как исправить приведение указателя к целому числу? - PullRequest
0 голосов
/ 04 марта 2019

Я пишу программу, которая создает двусвязный список из массива.Вот код на данный момент:

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

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

struct Node *create_dll_from_array(int array[], int x) {
    int i;
    struct Node *newNode, *temp, *head;

    for (i=0; i<x; i++) {
        newNode = (struct Node *)malloc(sizeof(struct Node));
        newNode->data = *(array+i);
        if (i=0) {
            head = newNode;
            temp = newNode;
            newNode->next = NULL;
            newNode->previous = NULL;
        }
        else {
    ***     temp->next = (struct Node*) newNode->data;
            newNode->next = NULL;
    ***     newNode->previous = (struct Node*) temp->data;
            temp = newNode;
        }
    }
return head;
}

int main(){
    int array[5] = {11,2,7,22,4};
    struct Node* head;
    head = create_dll_from_array(array,5);
    return 0;
}

Итак, в строках с *** я получаю сообщение об ошибке: предупреждение: приведение к указателю из целого числа разного размера Я не знаю, работает ли сама программана самом деле работает, просто спрашивая об этих двух строках и почему они не работают.Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Вы можете улучшить эти вещи:

  1. Всегда инициализируйте указатель с помощью NULL.Это защитит вас от указателя, указывающего на неверный адрес.
  2. Не указывайте значение размера массива жестко.Рассчитайте его.
  3. В условии if вы использовали присвоение =.Измените это на проверку равенства ==.Если вы этого не сделаете, ваша программа будет сбой .

, только спросив об этих двух строках и почему они не работают

Это потому, что temp->next указывает на область памяти типа struct node.Вы не можете присвоить ему целочисленное значение (как вы это делали).Я воспроизвел ваш полный код ниже некоторых ваших комментариев:

#include<stdio.h>
#include<stdlib.h>
struct Node {
    int data;
    struct Node *next;
    struct Node *previous;
};

struct Node *create_dll_from_array(int array[], int x) {
    int i;
    // struct Node *newNode, *temp, *head;
    struct Node *newNode= NULL, *temp=NULL, *head=NULL;

    for (i=0; i<x; i++) {
        newNode = (struct Node *)malloc(sizeof(struct Node));
        newNode->data = *(array+i);
        // if (i=0) {   Its wrong
        if (i==0) {
            head = newNode;
            temp = newNode;
            newNode->next = NULL;
            newNode->previous = NULL;
        }
        else {
            // temp->next = (struct Node*) newNode->data; // issue
            temp->next = (struct Node*) newNode;
            newNode->next = NULL;
            // newNode->previous = (struct Node*) temp->data; //issue
            newNode->previous = (struct Node*) temp; //issue
            temp = newNode;
        }
    }
return head;
}

int main(){
    // int array[5] = {11,2,7,22,4};
    int array[] = {11,2,7,22,4};
    struct Node* head;
    // head = create_dll_from_array(array,5);
    head = create_dll_from_array(array,sizeof(array)/sizeof(*array));
    return 0;
}

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

0 голосов
/ 04 марта 2019

Как исправить приведение указателя к целому числу?

Не назначайте указатель int, и тогда необходимость в приведении исчезнет.

Назначить указатель на указатель.

// temp->next = (struct Node*) newNode->data;
temp->next = newNode;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...