我正在尝试构建邻接列表,但会收到以下错误
graph.c:16:错误:下标值既不是数组也不是指针
我读到在尝试索引非数组时会发生此错误。当我能够直接向其添加元素时(第58行:graph [i] = root),我可以知道将结构数组的成员分配给NODE时的错误是什么吗?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 10
struct node{
int data;
struct node * link;
};
typedef struct node * NODE;
NODE graph[MAX];
void displayGraph (graph, n){
int i;
NODE cur;
for (i=0;i<n;i++){
cur = graph[i];
while(cur != NULL){
printf("%d ", cur->data);
}
}
}
NODE insert (NODE root, NODE temp){
NODE mine;
mine = root;
if (mine == NULL)
return root;
while(mine != NULL){
mine = mine->link;
}
mine->link = temp;
return root;
}
main ()
{
int n=0;
int i;
int val;
char * choice;
NODE temp, root;
printf("Enter the number of nodes\n");
scanf("&d", n);
for (i=0;i<n;i++){
root = NULL;
while(1){
printf("Is there an adjacent node?Y:N");
scanf("%s", choice);
if(!strcmp(choice, "N"));
break;
printf("Enter the adjacent node\n");
scanf("%d", val);
temp = malloc(sizeof (struct node));
temp->data = val;
temp->link = NULL;
root = insert(root, temp);
}
graph[i] = root;
}
displayGraph (graph, n);
}
答案 0 :(得分:2)
在声明displayGraph函数时,您没有为变量图指定类型。
void displayGraph (graph, n);
看到图形是全局声明的,您可以在技术上省略图形作为此函数的参数。您还需要为变量n提供一个类型,但如果您坚持让displayGraph接受图形数组,那么请更改:
void displayGraph (graph, n){
到
void displayGraph (NODE graph[], int n){
您的代码还有一些其他问题,但这应该可以解决您所询问的错误。
答案 1 :(得分:0)
除了格式化渲染此代码难以阅读和理解之外,代码中的问题还包括:
通常,您对scanf()
的调用需要语法更正:
即scanf("&d", &n);
应为scanf("%d", &n);
(%
代替&
作为第一个参数)
第12行:void displayGraph (graph, n){
功能定义应该是:
void displayGraph (NODE * graph, int n){
我假设int n
因为int n=0;
出现在代码之前
我因为声明而假设NODE *:
typedef struct node * NODE;
NODE graph[MAX];
cur;
是NODE类型的单个实例
图形[MAX];是NODE类型的实例数组
第13行:cur = graph[i];
不是合法转让
您可以执行类似这样的操作来初始化指针cur:
NODE graph[MAX], *cur;
cur = &graph[0];//to initialize cur to the first position of graph
第48行,scanf("%s", choice);
选择在创建时未初始化,请执行以下操作:
char * choice;
然后,在你使用它之前:
choice = malloc(NumBytes); //其中NumBytes是一个足够大的字节值,用于扫描到它的字符串。
第49行:以下行导致第51行无法访问的代码:
if(!strcmp(choice, "N"));
break; ^
删除if语句后的;
第52行:val
先前未初始化,此处应写为&val
在下面的代码中,我已经解决了所有提到的问题,包括格式化,但是,我没有调试你的代码,所以我不确定它会编译和构建以外的任何东西:)
#include<stdlib.h>
#include<string.h>
#define MAX 10
struct node{
int data;
struct node * link;
};
typedef struct node * NODE;
NODE graph[MAX];
void displayGraph (NODE * graph, int n);
NODE insert(NODE root, NODE temp);
main ()
{
int n=0;
int i;
int val;
char * choice;
NODE temp, root;
printf("Enter the number of nodes\n");
scanf("%d", &n);
for (i=0;i<n;i++)
{
root = NULL;
while(1)
{
choice = malloc(2);//based on promted answer being only 1 byte long
printf("Is there an adjacent node?Y:N");
scanf("%s", choice);
//if(!strcmp(choice, "N"))//case sensitive
if(!stricmp(choice, "N")) //not case sensitive
{
break;
}
printf("Enter the adjacent node\n");
scanf("%d", &val);
temp = malloc(sizeof (struct node));
temp->data = val;
temp->link = NULL;
root = insert(root, temp);
free(choice);
}
graph[i] = root;
}
displayGraph (graph, n);
}
void displayGraph (NODE * graph, int n)
{
int i;
NODE cur;
for (i=0;i<n;i++)
{
cur = graph[i];
while(cur != NULL)
{
printf("%d ", cur->data);
}
}
}
NODE insert(NODE root, NODE temp)
{
NODE mine;
mine = root;
if (mine == NULL) return root;
while(mine != NULL)
{
mine = mine->link;
}
mine->link = temp;
return root;
}