这是我到目前为止所拥有的!我很困惑,因为我不知道在哪里添加它们。我们一直在课堂上研究节点,但是我的教授甚至不想在你提问时解释。这是我们的家庭作业。所以我想知道如何创建一个函数来将一个节点添加到链接列表中?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Node
{
double nodeData;
int nodeLink;
};
void main(void)
{
struct Node List[15];
int Begin, current;
Begin = 0;
for (current = Begin; current < 15; current++)
List[current].nodeLink = 0;
List[0].nodeData = 3.141593;
List[0].nodeLink = -1;
List[1].nodeData = 25.992;
List[1].nodeLink = -1;
List[0].nodeLink = 1;
for (int i = Begin; i != -1; i = List[i].nodeLink)
printf("%f\n", List[i].nodeData);
}
答案 0 :(得分:1)
Node.h
#ifndef NODE_H
#define NODE_H
struct Node {
double nodeData;
int nodeLink;
};
extern struct Node *new_Node(double value);
extern void free_Node(struct Node *node);
extern struct Node *next_Node(struct Node *node);
extern void add_to_last_Node(struct Node *list, struct Node *node);
#endif
Node.c
#include <stddef.h>
#include "Node.h"
#define NUM_OF_NODES 15
#define END_OF_NODE -1
#define UNUSED -2
static int initialized = 0;
static int current = 0;
static struct Node Node_pool[NUM_OF_NODES];
static void init(void){
for(int i=0; i < NUM_OF_NODES; i++){
Node_pool[i].nodeLink = UNUSED;
}
initialized = 1;
}
struct Node *new_Node(double value){
if(!initialized)
init();
if(current < NUM_OF_NODES){
Node_pool[current].nodeData = value;
Node_pool[current].nodeLink = END_OF_NODE;
return &Node_pool[current++];
} else {
for(int i=0; i < NUM_OF_NODES; ++i){
if(Node_pool[i].nodeLink == UNUSED){
Node_pool[i].nodeData = value;
Node_pool[i].nodeLink = END_OF_NODE;
return &Node_pool[i];
}
}
return NULL;
}
}
void free_Node(struct Node *node){
node->nodeLink = UNUSED;
}
struct Node *next_Node(struct Node *node){
return node->nodeLink < 0 ? NULL : Node_pool + node->nodeLink;
}
void add_to_last_Node(struct Node *list, struct Node *node){
if(!list || !node)
return ;
struct Node *temp = list, *prev = NULL;
while(temp = next_Node(prev = temp))
;
prev->nodeLink = node - Node_pool;
}
的main.c
#include <stdio.h>
#include "Node.h"
int main(void){
struct Node *begin, *aNode, *temp;
begin = new_Node(3.141593);
aNode = new_Node(25.992);
add_to_last_Node(begin, aNode);
aNode = new_Node(2.2360679);
add_to_last_Node(begin, aNode);
for(temp = begin; temp != NULL; temp = next_Node(temp))
printf("%f\n", temp->nodeData);
temp = begin;
while(temp){
struct Node *save = temp;
temp = next_Node(temp);
free_Node(save);
}
return 0;
}
>gcc main.c Node.c -std=c99 -o sample
>sample
3.141593
25.992000
2.236068
答案 1 :(得分:0)
Node* newNode = new Node();
newNode->nodeData = 3.14d;
currentNode->nodeLink = newNode;
如果由于某种原因你需要它是一个int,你可以使用重新解释转换:
Node* currentNode = reinterpret_cast<Node*>(currentNode->nodeLink); // Grab the next link
currentNode->nodeLink = reinterpret_cast<int>(newNode); // Do the assignment
但是这会在像x86_64系统这样的sizeof(void *)!= sizeof(int)的系统上中断,所以这就是为什么@Michael在评论中说它应该是一个实际的指针值,不是一个int。一般来说编程实践也很糟糕,没有充分理由这样做。
答案 2 :(得分:0)
这是一个可能的函数签名:
#define MAXIMUM_NODES 15
void Add_To_List(double value, Node singly_list[MAXIMUM_NODES])
{
}
您可以通过main
功能调用它:
Add_To_List(3.14159, list);