2015-09-24 2 views
0

Это то, что у меня есть до сих пор! Я смутился, потому что не знаю, где их добавить. Мы работаем над узлами в классе на какое-то время, но мой профессор не любит объяснять, даже когда вы задаете вопросы. это наше домашнее задание. Поэтому я хотел бы знать, как создать функцию для добавления узла в список ссылок?Как создать узел, а затем добавить его в список ссылок?

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



} 
+2

Почему ваш '' nodeLink' в int'? Он должен ссылаться на следующий «Node» – Michael

+5

Независимо от того, насколько хорош или плох ваш профессор, правильный способ сделать домашнее задание связанного списка - сначала нарисовать его на бумаге, как будет выполняться каждая операция. Рисуйте коробки, линии и т. Д. Не пытайтесь писать программу «с головы». Как только вы увидите, как это делается на бумаге, тогда перевод этого кода более или менее является легкой частью. – PaulMcKenzie

+0

Наш профессор сказал, что nodeLink может быть int. – DarJude

ответ

0

Связанный список буквально что: Его список узлов, которые указывают на следующий узел (кстати, nodeLink должен быть типа Node *, не ИНТ) для формирования связей между друг с другом. Основной односторонний связанный список будет отслеживать указатель на голову (который также является просто узлом *) и использовать его для рекурсии вниз (начинать с головы, получать следующий указатель, а затем получать следующий указатель от него, затем следующий из этого ...), пока вы не найдете позицию, на которую хотите повлиять, или пока следующий nodeLink не будет равен NULL. Оттуда его просто создать новый узел и присвоение значения nodeLink соответственно:

Node* newNode = new Node(); 
newNode->nodeData = 3.14d; 
currentNode->nodeLink = newNode; 

Если вы потребности это быть ИНТОМ по какой-то причине, вы можете использовать переинтерпретировать роли:

Node* currentNode = reinterpret_cast<Node*>(currentNode->nodeLink); // Grab the next link 
currentNode->nodeLink = reinterpret_cast<int>(newNode); // Do the assignment 

Но это сломается на системах, где sizeof (void *)! = Sizeof (int), как x86_64, поэтому поэтому @Michael в комментариях сказал, что должен быть фактическим значением указателя, а не int. Это также, как правило, плохая практика программирования, чтобы делать такие вещи без уважительной причины.

+1

Ваша реализация не будет работать с массивом. Требование домашней работы заключается в реализации связанного списка с использованием массива. Вы не можете предположить, что все связанные списки используют кучу или указатели. В связанном списке на основе массива ссылки являются индексами слотов массива, содержащих узлы. Этот метод также будет работать с файлами, где ссылка - это позиция файла (смещение). –

+0

@ThomasMatthews Он не указал, что это должен быть массив. Он предоставил код, который использовал массив, но не заметил, что это требование. По крайней мере, когда я написал ответ, такого указания не было. – Ragora

+1

Посмотрите на структуру. Поле ссылки является целым числом. Посмотрите на объявление 'list', это ** массив структур **. –

0

Вот возможная функция подписи:

#define MAXIMUM_NODES 15 

void Add_To_List(double value, Node singly_list[MAXIMUM_NODES]) 
{ 
} 

Вы могли бы назвать его из main функции:

Add_To_List(3.14159, list); 
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