#c #pointers #casting
#c #указатели #Кастинг
Вопрос:
Я пишу программу, которая создает двусвязный список из массива. Пока что вот код:
#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;
}
Итак, в строках с *** я получаю ошибку: предупреждение: приведение к указателю из целого числа разного размера
Я не знаю, действительно ли работает сама программа, просто спрашиваю об этих двух строках и почему они не работают. Спасибо!
Комментарии:
1. Вы путаете
data
иpointers
2. Ошибка сообщает вам, что не так — вы берете
newNode->data
то, что вы объявили какint
, и присваиваете этоnext
указателюtemp
. Вы не хотите, чтобы указатель на другой узел продолжал некоторое целочисленное значение — они не смешиваются. Вероятно, вы просто хотите установитьtemp->next = newNode
. И аналогично для другого.3. Вы хотите создать новый узел. Приведение целого числа как
struct Node *
этого не делает. Вам нужно будет выделить структуру в памяти (читать дальшеmalloc
) и заполнить ее данные значением.4. В сторону: упростить код
newNode = (struct Node *)malloc(sizeof(struct Node));
—>newNode = malloc(sizeof *newNode);
5.
if (i=0) {
вероятно, это не делает того, что вы намереваетесь.
Ответ №1:
Как исправить приведение указателя к целому числу?
Не присваивайте int
указателю, и тогда необходимость в приведении отпадет.
Присвоите указатель указателю.
// temp->next = (struct Node*) newNode->data;
temp->next = newNode;
Ответ №2:
Вы можете улучшить эти вещи:
- Всегда инициализируйте свой указатель с помощью
NULL
. Это защитит вас от указателя, указывающего на недопустимый адрес. - Не закодируйте значение размера массива жестко. Вычислите это.
- В
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
условием