Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中声明邻接列表时遇到问题_C - Fatal编程技术网

在C语言中声明邻接列表时遇到问题

在C语言中声明邻接列表时遇到问题,c,C,这是我第一次尝试使用邻接列表,我真的对它的声明感到困惑 这是我的节点结构和用作第一个节点的列表,我称之为head typedef struct node { int NodeNum; struct node *next; }node; typedef struct list { node *head; }list; 在这里,我尝试为用户想要的磁头阵列分配正确的内存量 int n; scanf("%d", &n); list *NodLi

这是我第一次尝试使用邻接列表,我真的对它的声明感到困惑

这是我的节点结构和用作第一个节点的列表,我称之为head

typedef struct node
{
    int NodeNum;
    struct node *next;
}node;

typedef struct list
{
    node *head;
}list;
在这里,我尝试为用户想要的磁头阵列分配正确的内存量

int n;

scanf("%d", &n);

list *NodList[n] = {0};

for(int i = 0; i < n; i++)
{
    NodList[i] = (list*)malloc(sizeof(list));
    NodList[i]->head = NULL;
}
intn;
scanf(“%d”和“&n”);
列表*节点列表[n]={0};
对于(int i=0;ihead=NULL;
}

事情是这样的,我希望用户告诉我我将拥有多少节点,然后为其分配正确的内存量,但显然我在这里遇到了一些错误,例如数组在堆栈上声明为VLA:

#包括
#包括
#包括
类型定义结构节点
{
int值;
结构节点*下一步;
}t_节点;
bool构建链接列表(t节点**头部,内部n){
t_节点*节点;
t_节点*tmp;
静态int a=1024;//仅用于测试目的
if(!(node=(t_node*)malloc(sizeof(t_node)))
返回false;
节点->值=a;
*头部=节点;
对于(int i=1;ivalue=i+a;
节点->下一步=tmp;
node=tmp;
}
下一个;
}
}
返回0;
}

如果您有任何问题,请告诉我。

请进一步了解安东宁·加夫雷尔的答案。基本上使用他提出的同一个链表,并引入一个用于表示邻接列表的AListEntry。每个入口都指向一个顶点和该顶点的相邻顶点。它还指向下一个条目

相反,如果您提前知道顶点的数量,还可以使用动态分配的节点指针数组替换AListEntry。数组中的每个索引将对应于一个顶点,指针将指向该顶点的相邻顶点的头节点指针,这将是一个链接列表。您将得到一组链接列表

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

typedef struct Node
{
    int value;
    struct Node* next;
} t_Node;

t_Node* createNode(int value)
{
    t_Node* node = (t_Node*)malloc(sizeof(t_Node));
    node->value = value;
    node->next = NULL;
    return node;
}

t_Node* addNode(int value, t_Node* node)
{
    node->next = createNode(value);
    return node->next;
}

typedef struct AListEntry
{
    t_Node* vertex;
    t_Node* adjacentVertices;
    struct AListEntry* next;
} t_AListEntry;

t_AListEntry* createAListEntry(
    t_Node* vertex, 
    t_Node* adjacentVertices)
{
    t_AListEntry* entry = (t_AListEntry*)malloc(sizeof(t_AListEntry));
    entry->vertex = vertex;
    entry->adjacentVertices = adjacentVertices;
    entry->next = NULL;
    return entry;
}

void printAListEntries(t_AListEntry* aList)
{
    while (aList != NULL)
    {
        printf("%d -> [ ", aList->vertex->value);
        
        t_Node* node = aList->adjacentVertices;
        while (node != NULL)
        {
            printf("%d ", node->value);
            node = node->next;
        }
        
        printf("]\n");
        
        aList = aList->next;
    }
}

int main() 
{
    t_Node* v1 = createNode(1);
    
    t_Node* v1Adjacents = createNode(2);
    addNode(3, v1Adjacents);
    
    t_AListEntry* aList = createAListEntry(v1, v1Adjacents);
    
    t_Node* v2 = createNode(2);
    
    t_Node* v2Adjacents = createNode(1);
    addNode(3, v2Adjacents);
    
    aList->next = createAListEntry(v2, v2Adjacents);
    
    t_Node* v3 = createNode(3);
    
    t_Node* v3Adjacents = createNode(1);
    addNode(2, v3Adjacents);
    
    aList->next->next = createAListEntry(v3, v3Adjacents);
    
    printAListEntries(aList);
    
    return 0;
}
#包括
#包括
定义表结点
{
int值;
结构节点*下一步;
}t_节点;
t_节点*创建节点(int值)
{
t_节点*节点=(t_节点*)malloc(sizeof(t_节点));
节点->值=值;
节点->下一步=空;
返回节点;
}
t_节点*添加节点(int值,t_节点*节点)
{
节点->下一步=创建节点(值);
返回节点->下一步;
}
typedef结构条目
{
t_节点*顶点;
t_节点*邻接顶点;
结构AListEntry*下一步;
}t_ ;;
t_AListEntry*createAListEntry(
t_节点*顶点,
t_节点*邻接顶点)
{
t_AListEntry*entry=(t_AListEntry*)malloc(sizeof(t_AListEntry));
输入->顶点=顶点;
条目->邻接顶点=邻接顶点;
entry->next=NULL;
返回条目;
}
作废printAListEntries(t_AListEntry*aList)
{
while(aList!=NULL)
{
printf(“%d->[”,列表->顶点->值);
t_Node*Node=aList->邻接顶点;
while(节点!=NULL)
{
printf(“%d”,节点->值);
节点=节点->下一步;
}
printf(“]\n”);
aList=aList->next;
}
}
int main()
{
t_Node*v1=createNode(1);
t_Node*v1adjancets=createNode(2);
addNode(3,v1邻接);
t_AListEntry*aList=createAListEntry(v1,v1邻接);
t_Node*v2=createNode(2);
t_Node*v2Adjacents=createNode(1);
addNode(3个,v2个相邻节点);
aList->next=createAListEntry(v2,v2相邻);
t_Node*v3=createNode(3);
t_Node*v3Adjacents=createNode(1);
addNode(2个,v3个相邻节点);
aList->next->next=createAListEntry(v3,v3Adjacents);
印刷主义者;
返回0;
}

vertice的定义是什么?您希望它是VLA还是已分配?可以使用
list NodList[n]={{0}创建结构
list
的数组
然后您只需要创建
struct node
的链接列表。我很惊讶这甚至可以编译:您不能用非常量变量声明节点指针数组。如果要报告链表的长度,您需要维护一个全局计数器,该计数器由插入器/删除器递增/递减,或者遍历链表。@PeterT在C99中被添加到C中(仍然存在,但在C11中是可选的)。gcc和clang都支持C代码的VLA(并允许它们作为C++的扩展)。不确定MS。因此,如果使用正确的编译器,您可以声明大小为非常量的节点指针数组。但是,当你只需要声明结构数组时,就不需要使用指针数组。我认为他想要的是一个,可以用来表示一个图:“Guido van Rossum建议的一个实现使用一个哈希表将图中的每个顶点与相邻顶点数组相关联。”只需创建一个哈希表,然后为每个顶点添加一个条目,其中键是
NodeNum
,值是相邻顶点的链接列表。我明白了,我将编辑它需要是一个数组,因为@Alex Riveron说我正在尝试使用一个图,长话短说,我需要一个结构列表的数组,我声明查看我的编辑,根据Cormen等人的定义,这是一个链表数组。嘿,伙计,谢谢,这正是我需要的,非常感谢