Comment mettre en place une liste liée dans C?

Je suis entrain de créer un liste liée comme dans la question précédente, j'ai demandé. J'ai trouvé que la meilleure façon de développer la liste chaînée est d'avoir la tête et la queue dans une autre structure. Mes produits struct sera imbriquée à l'intérieur de cette structure. Et je devrais être en train de passer la liste à la fonction d'ajout et de suppression. Je trouve ce concept confus.

J'ai mis en œuvre les initialiser, d'ajouter et de clean_up. Cependant, je ne suis pas sûr que je l'ai fait correctement.

Quand j'ajoute un produit à la liste, je déclare de la mémoire à l'aide de calloc. Mais je pense que je ne devrais pas être de déclarer la mémoire pour le produit à la place. Je suis vraiment confus au sujet de cet ajout.

Un grand merci pour toutes les suggestions,

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PRODUCT_NAME_LEN 128
typedef struct product_data 
{
int product_code;
char product_name[PRODUCT_NAME_LEN];
int product_cost;
struct product_data_t *next;
}product_data_t;
typedef struct list 
{
product_data_t *head;
product_data_t *tail;
}list_t;
void add(list_t *list, int code, char name[], int cost); 
void initialize(list_t *list);
void clean_up(list_t *list);
int main(void)
{
list_t *list = NULL;
initialize(list);
add(list, 10, "Dell Inspiron", 1500);
clean_up(list);
getchar();
return 0;
}
void add(list_t *list, int code, char name[], int cost)
{
//Allocate memory for the new product
list = calloc(1, sizeof(list_t));
if(!list)
{
fprintf(stderr, "Cannot allocated memory");
exit(1);
}
if(list)
{
//First item to add to the list
list->head->product_code = code;
list->head->product_cost = cost;
strncpy(list->head->product_name, name, sizeof(list->head->product_name));
//Terminate the string
list->head->product_name[127] = '/0';
} 
}
//Initialize linked list
void initialize(list_t *list)
{
//Set list node to null
list = NULL;
list = NULL;
}
//Release all resources
void clean_up(list_t *list)
{    
list_t *temp = NULL;
while(list)
{
temp = list->head;
list->head = list->head->next;
free(temp);    
}
list = NULL;
list = NULL;
temp = NULL;
}

============================== Édité ============================

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PRODUCT_NAME_LEN 64
//typedef struct product_data product_data_t;
typedef struct product_data 
{
int product_code;
char product_name[PRODUCT_NAME_LEN];
int product_cost;
}product_data_t;
typedef struct list
{
struct list *head;
struct list *tail;
struct list *next;
struct list *current_node;
product_data_t *data;
}list_t;
void add(list_t *list, int code, char name[], int cost); 
int main(void)
{
list_t *list = NULL;
list = initialize(list);
add(list, 1001, "Dell Inspiron 2.66", 1299);
add(list, 1002, "Macbook Pro 2.66", 1499);
clean_up(list);
getchar();
return 0;
}
void add(list_t *list, int code, char name[], int cost)
{
/* Allocate memory for the new product */
product_data_t *product = (product_data_t*) calloc(1, sizeof(*product));
if(!product)
{
fprintf(stderr, "Cannot allocate memory.");
exit(1);
}
/* This is the first item in the list */
product->product_code = code;
product->product_cost = cost;
strncpy(product->product_name, name, sizeof(product->product_name));
product->product_name[PRODUCT_NAME_LEN - 1] = '\0';
if(!list->head)
{
/* Assign the address of the product. */
list = (list_t*) product;   
/* Set the head and tail to this product */
list->head = (list_t*) product;
list->tail = (list_t*) product;
}
else
{
/* Append to the tail of the list. */
list->tail->next = (list_t*) product;
list->tail = (list_t*) product;
}
/* Assign the address of the product to the data on the list. */
list->data = (list_t*) product;
}
  • Est-il question ici?
  • Le code de la initialize() est faux (tu avais seulement besoin d'au plus l'un des deux devoirs écrits, mais qui n'a aucun effet bénéfique); vous avez probablement censé liste->tete = NULL; liste->fin = NULL; et il y a un problème similaire dans clean_up().
  • rendre cette un wiki de la communauté.
  • connexes: codereview.stackexchange.com/questions/139482/...
InformationsquelleAutor ant2009 | 2009-06-11