Начну с того, что я совершенно новичок в C, и сейчас я борюсь с некоторыми очень неинтуитивными ошибками. Я уже давно пытаюсь найти какое-то решение, но я всегда нахожусь в тупике.Графическое представление с динамическими связанными списками
Я пытаюсь создать пару функций для вставки и отображения графика через динамические связанные списки. Во время компиляции все работает отлично, но элементы, похоже, не отображаются хорошо. Фактически, как и на изображении ниже, отображается только первый элемент узла.
Итак, возникает вопрос, что вызывает эти ошибки и предупреждения, и что делать, чтобы удалить их?
Если вы посмотрите на код ниже, вы увидите, что она имеет несколько предупреждений (я не знаю, почему они появляются - я использую блоки кода в Ubuntu с компилятором GNU) а также проблемы при отображении элементов графика. Проблема наиболее вероятна в функции display_graph, но я не могу понять, где.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct AdjListNode {
int dest;
struct LIST_NODE *next;
} LIST_NODE;
typedef struct AdjList {
struct LIST_NODE *head;
} ADJACENCY_LIST;
LIST_NODE *create_node(int dest) {
LIST_NODE *nod;
if(dest<0) exit(0);
nod = (LIST_NODE*)malloc(sizeof(LIST_NODE));
if(nod==NULL) {
printf("Problems at memory allocation!");
exit(0);
}
nod->dest = dest;
nod->next = NULL;
return (LIST_NODE*)nod;
}
void display_graph(ADJACENCY_LIST *v) {
int s, i;
LIST_NODE *nod;
s = sizeof(v);
for(i=0;i<=s;i++) {
nod = v[i].head;
//citeste lista cu head in primul nod
while(nod!=NULL) {
printf("Data from node: %d \n", nod->dest);
nod = nod->next;
}
}
}
int main()
{
int n; //number of graph nodes
int i; //just a counter
int dest; dest = -1; //it's actually the "name" of the nodes. They must all be positive so I started negative
char c;
ADJACENCY_LIST *t;
printf("The number of nodes of the graph: ");
scanf("%d", &n);
t = (ADJACENCY_LIST*)malloc(n*sizeof(ADJACENCY_LIST));
/* We make a loop for the nodes and each node has a while thru which I make the links */
for(i=0;i<n;i++) {
c = 'D'; // Initializing
printf("Specify the links of the node %d with the others:\n", i);
int contor; contor = 0;
while(c=='D') {
LIST_NODE *nod;
printf("The link with node: ");
scanf("%d%*c", &dest);
if(dest>=0){
nod = create_node(dest);
if(contor==0) t[i].head = (LIST_NODE*)nod; // just make the first node a head node
} else nod = NULL;
//verificam daca vrem sa continuam
printf("Do you want to link any other node to %d?(D to add, anything else STOP\n)", i);
c = getchar();
contor++; //increment counter
}
// inchidem lista
}
display_graph(t);
return 0;
}
Любая помощь будет принята с благодарностью!
EDIT: Как Christhofe (подтвердили проблему) и Абхишек ВАСИШТ указал размер вектора V возвращается на самом деле размер указателя.
Но, есть еще несколько предупреждений, которые я не знаю, почему они до сих пор появляются ... все
|| === Сложение: Отладка в Grafuri1 (компилятор: GNU GCC компилятора) === | /home/marianpc/Anul_1/SDA/Grafuri1/main.c||In функция 'display_graph': | /home/marianpc/Anul_1/SDA/Grafuri1/main.c|33|warning: назначение из несовместимого типа указателя | /home/marianpc/Anul_1/SDA/Grafuri1/main.c|38|warning: назначение из несовместимого типа указателя | /home/marianpc/Anul_1/SDA/Grafuri1/main.c|28|warning: неиспользуемая переменная '[-Wunused-variable] | /home/marianpc/Anul_1/SDA/Grafuri1/main.c||В функции 'main': | /home/marianpc/Anul_1/SDA/Grafuri1/main.c|71|warning: назначение из несовместимого типа указателя | /home/marianpc/Anul_1/SDA/Grafuri1/main.c|76|warning: назначение из несовместимого типа указателя | || === Сборка завершена: 0 ошибок, 5 предупреждений (0 минут, 0 секунд) === |
Главное, что программа функционирует сейчас. Большое спасибо, ребята! Действительно полезно!
определения Struct не следует typedef'd.typedef'ing загромождает код, приводит к недоразумениям, делает код более трудным для людей читать и загромождает пространство имен компилятора. предложите использовать имена тегов в определениях структур, тогда когда когда-либо необходимость объявления структуры (или передачи параметров) использует «struct tagname» – user3629249
, общая практика (и для удобочитаемости) должна использовать только «все капиталы» для #define имен и констант , Предложите использовать аргумент «camel» для переменных, функций и т. Д. – user3629249
в C, возвращаемое значение из malloc() и семейства функций не должно быть отлито. – user3629249