Входы связанного списка перезаписываются - PullRequest
0 голосов
/ 09 октября 2011

Мне нужна помощь с перезаписью моего кода предыдущих входов, которые были сохранены в моем связанном списке.Этот проект намного больше, чем у меня здесь, но я не могу продолжать, пока не выясню эту проблему.Так, скажем, пользователь вводит «ins mom», «ins dad», «ins bob», если он выполняет команду «prl», он выведет «bob bob bob».Получается правильное количество узлов, но последняя введенная команда ins всегда заполняет список и перезаписывает предыдущие элементы.Я потратил некоторое время, пытаясь это исправить, но все еще не могу понять это.Кто-нибудь может мне помочь?

struct node{
    char *symbol;
    int count;
    struct node *next;
};
int main(void){

    void insert_node(struct node**,struct node**,char*,int);
    void print_list(struct node*); 

    struct node *head,*tail;
    char command[MAX]; 
    char word[MAX];
    int i = 1;
    head = tail = NULL;

    printf("Command? ");
    scanf("%s",command);
    if((strcmp(command,"prl")==0))
    {
        printf("The list is empty.");
        printf("Command? ");
        scanf("%s",command);    
    }
    else{
        scanf("%s",word);
    }
    while((strcmp(command,"end") != 0))
    {  
        if((strcmp(command,"ins")== 0))
        {
            insert_node(&head,&tail,word,i);
        }
        printf("Command? ");
        scanf("%s",command);
        if((strcmp(command,"prl")==0))
        {
            print_list(head);
        }
        else{
            scanf("%s",word);
        }
    }
    return 0;
}
void insert_node(struct node**h,struct node**t,char w[],int c) //inserts string into the list
{
    struct node *temp;

    if((temp = (struct node *)malloc(sizeof(struct node))) == NULL){
        printf("Node allocation failed. \n");
        exit(1);
    }
    temp->count = c;
    temp->symbol = w;
    temp->next = NULL; //edited this in

    if(*h == NULL)
    {
        *h = *t = temp;

    }
    else{
        (*t)->next = temp;  *t = (*t)->next;
    }
}
void print_list(struct node *h){ //prints the list

    if(h == NULL){
        printf("The list is empty.\n");
    }
    else{
        while(h != NULL)
        {
            printf("%d %s\n",h->count,h->symbol);
            h = h->next;
        }
    }
}

Ответы [ 2 ]

1 голос
/ 09 октября 2011

Прежде всего, вы должны помнить, что нужно ставить:

temp->symbol

, а не просто использовать простое уравнение для вставки строки в другую.Используйте:

strcpy()

после выделения памяти для строки.

Во-вторых, в вашей функции печати должны быть напечатаны все узлы, кроме последнего, поскольку цикл while будет прерван.Проверьте лучше свой код, и все будет в порядке:)

0 голосов
/ 09 октября 2011
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 80

typedef struct node{
    char *symbol;
    int count;
    struct node *next;
} Node;

Node* make_node(char *word, int count){
    Node *temp;
    char *w;
    if((temp = (Node*)malloc(sizeof(Node))) == NULL){
        printf("Node allocation failed. \n");
        exit(1);
    }
    if((w = strdup(word)) == NULL){
        printf("word allocation failed. \n");
        exit(1);
    }
    temp->count = count;
    temp->symbol = w;
    temp->next = NULL;
    return temp;
}

void node_free(Node *node){
    if(node == NULL) return;
    if(node->next){
        node_free(node->next);
    }
    free(node->symbol);
    free(node);
}

void insert_node(Node **h, Node **t, char *w, int c){ //inserts string into the list
    Node *temp;

    temp = make_node(w, c);

    if(*h == NULL){
        *h = *t = temp;
    } else {
        (*t)->next = temp;
        *t = temp;
    }
}
void print_list(Node *h){ //prints the list

    if(h == NULL){
        printf("The list is empty.\n");
    }
    else{
        while(h != NULL){
            printf("%d %s\n",h->count, h->symbol);
            h = h->next;
        }
    }
}

int main(void){
    Node *head,*tail;
    char command[MAX]; 
    char word[MAX];
    int i = 1;
    head = tail = NULL;

    do{  
        printf("Command? ");
        scanf("%s", command);
        if(strcmp(command,"prl") ==0){
            print_list(head);
        } else  if(strcmp(command,"ins") == 0){
            printf("input word:");
            scanf("%s",word);
            insert_node(&head,&tail, word, i++);
        }
    }while(strcmp(command,"end") != 0);
    node_free(head);

    return 0;
}
...