簡體   English   中英

C中的鏈表

[英]Linked List in C

我正在c中練習鏈表,我想使用rand在節點中存儲字符,但是列表中的最后一個字母重復了,誰能看到會發生什么?

用這個函數我填充節點:

nodo* nodoListas(nodo*Lista){
    int i;
    char *elemento, caracter;
    srand (time(NULL));
    for (i = 0; i< CANT_NODOS; i++){
        caracter = /*(char*)*/(65 +rand()% 25);
        elemento = &caracter;
        Lista = agregarNodo (Lista, elemento);
    }
}

這是 agregarNodo 函數:

nodo* agregarNodo (nodo* Lista, char* elemento){
    nodo* nuevoNodo, *aux;
    nuevoNodo = (nodo*) malloc (sizeof(nodo));
    nuevoNodo -> elemento = elemento;
    nuevoNodo -> siguiente = NULL;
    if(Lista == NULL){
        Lista = nuevoNodo;
    }
    else{
        aux = Lista; //para no perder el elemento
        while(aux->siguiente != NULL){
                aux = aux -> siguiente;             
            }
        aux-> siguiente = nuevoNodo;
    }
    return Lista;
}

這是我正在做的代碼:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define CANT_NODOS 5

typedef struct Nodo{
    char* elemento;
    struct Nodo* siguiente; /*vinculo para unir mas nodos*/
}nodo;

//funcion que genera o crea una lista
nodo* ListaElementos(nodo* Lista){
    Lista = NULL ;
    return Lista;
}

// funcion que agrega nodos a la lista 

nodo* agregarNodo (nodo* Lista, char* elemento){
    nodo* nuevoNodo, *aux;
    nuevoNodo = (nodo*) malloc (sizeof(nodo));
    nuevoNodo -> elemento = elemento;
    nuevoNodo -> siguiente = NULL;
    if(Lista == NULL){
        Lista = nuevoNodo;
    }
    else{
        aux = Lista; //para no perder el elemento
        while(aux->siguiente != NULL){
                aux = aux -> siguiente;             
            }
        aux-> siguiente = nuevoNodo;
    }
    return Lista;
}
//Funcion que libera la memoria
void LiberarLista (nodo* Lista ){   

    free (Lista);
}

nodo* Lista1;
nodo* Lista2;

nodo* nodoListas(nodo*Lista){
    int i;
    char *elemento, caracter;
    srand (time(NULL));
    for (i = 0; i< CANT_NODOS; i++){
        caracter = /*(char*)*/(65 +rand()% 25);
        elemento = &caracter;
        Lista = agregarNodo (Lista, elemento);
    }
}

int main(void){
    Lista1 = ListaElementos(Lista1);
    Lista2 = ListaElementos(Lista2);
    Lista1 = nodoListas(Lista1);

//impresion Lista 1
    while (Lista1 != NULL){
        printf("%s\t", Lista1->elemento);
        Lista1 = Lista1 -> siguiente;
    }
    return 0;
}

當你這樣做時:

caracter = /*(char*)*/(65 +rand()% 25);
elemento = &caracter;

您正在聲明為字符的內存空間中寫入新的隨機值,然后將指針 (elemento) 放入該內存空間。 但是您總是在所有 for 循環中使用相同的內存空間字符。 所以你總是在同一個地方寫作並指向同一個地方,只是更新它的值,因此重復最后一個字符值。

你總是在你的代碼中指向相同的內存

caracter = /*(char*)*/(65 +rand()% 25);
elemento = &caracter;

您可以使用

    caracter=malloc(sizeof(char));
    *caracter = /*(char*)*/(65 +rand()% 25);
    //sleep(1);
    elemento = caracter;

順便說一句,您應該在這里使用字符數組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM