0

我正在尝试构建邻接列表,但出现以下错误

graph.c:16:错误:下标值既不是数组也不是指针

我读到当一个非数组试图被索引时会发生这个错误。当我能够直接向它添加一个元素时(第 58 行:graph[i] = root),我可以知道将结构数组的成员分配给节点的错误是什么吗?

#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);
}
4

2 回答 2

2

声明 displayGraph 函数时,您没有为变量图指定类型。

void displayGraph (graph, n);

看到 graph 是全局声明的,你可以在技术上省略 graph 作为这个函数的参数。您还需要为变量 n 提供一个类型,但如果您坚持让 displayGraph 接受图形数组,则更改:

void displayGraph (graph, n){

void displayGraph (NODE graph[], int n){

您的代码还有一些其他问题,但这应该可以解决您所询问的错误。

于 2013-10-25T22:18:37.783 回答
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 graph[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); 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;
}
于 2013-10-25T22:25:59.907 回答