Pytanie do listy dwukierunkowej

0

Nie rozumiem, w czym mam błąd, bo po skompilowaniu i uruchomieniu, program wypisuje na ekranie po kilka razy to samo i niektóre zdania
są po prostu ze sobą połączone (niektóre niepotrzebne). Czy może ktoś to naprawić?

#include <stdio.h>
#include <stdlib.h>
 
struct wiadomosc {
    int slowo;
    struct wiadomosc * poprzednia;
    struct wiadomosc * nastepna;
}*pierwsza, *ostatnia;
 
 

void stworzyc_Liste(int n);
void drukowac_Liste();
void usunac_Z_Poczatku();
void usunac_Z_Konca();
void usunac_Nta_wiadomosc(int position);
 
 
int main()
{
    int n, slowo, wybor=1;
 
    pierwsza = NULL;
    ostatnia = NULL;
 

    while(wybor != 0)
    {
        printf("============================================\n");
        printf("PROGRAM LISTA DWUKIERUNKOWA\n");
        printf("============================================\n");
        printf("1. Stworzyc Liste\n");
        printf("2. Usunac wiadomosc - z poczatku\n");
        printf("3. Usunac wiadomosc - z konca\n");
        printf("4. Usunac wiadomosc - N-ta\n");
        printf("5. Wydrukowac liste\n");
        printf("0. Wyjsc\n");
        printf("--------------------------------------------\n");
        printf("Wprowadz swoj wybor : ");
        scanf("%d", &wybor);
 
        switch(wybor)
        {
            case 1:
                printf("Wprowadz calkowita liczbe wiadomosci w liscie: ");
                scanf("%d", &n);
                stworzyc_Liste(n);
                break;
            case 2:
                usunac_Z_Poczatku();
                break;
            case 3:
                usunac_Z_Konca();
                break;
            case 4:
                printf("Wprowadz numer porzadkowy wiadomosci, ktora chcesz usunac: ");
                scanf("%d", &n);
                usunac_Nta_wiadomosc(n);
                break;
            case 5:
                drukowac_Liste();
                break;
            case 0:
                break;
            default:
                printf("Blad! Niewlasciwy wybor. Prosze wybrac pomiedzy 0-5");
        }
 
        printf("\n\n\n\n\n");
    }
 
    return 0;
}
 
void stworzyc_Liste(int n)
{
    int i;
	char slowo;
    struct wiadomosc *nowaWiadomosc;
 
    if(n >= 1)
    {
       
        pierwsza = (struct wiadomosc *)malloc(sizeof(struct wiadomosc));
 
        printf("Wprowadz slowo dla pierwszej wiadomosci: ");
        scanf("%c", &slowo);
 
        pierwsza->slowo = slowo;
        pierwsza->poprzednia = NULL;
        pierwsza->nastepna = NULL;
 
        ostatnia = pierwsza;
 
    
        for(i=2; i<=n; i++)
        {
            nowaWiadomosc = (struct wiadomosc *)malloc(sizeof(struct wiadomosc));
 
            printf("Wprowadz slowo dla %d wiadomosci: ", i);
            scanf("%c", &slowo);
 
            nowaWiadomosc->slowo = slowo;
            nowaWiadomosc->poprzednia = ostatnia; 
            nowaWiadomosc->nastepna = NULL;
 
            ostatnia->nastepna = nowaWiadomosc; 
            ostatnia = nowaWiadomosc; 
        }
 
        printf("\nLISTA DWUKIERUNKOWA POMYSLNIE STWORZONA\n");
    }
}
 
 
void drukowac_Liste()
{
    struct wiadomosc * tymczasowa;
    int n = 1;
 
    if(pierwsza == NULL)
    {
        printf("Lista jest pusta.\n");
    }
    else
    {
        tymczasowa = pierwsza;
        printf("Slowo w liscie:\n");
 
        while(tymczasowa != NULL)
        {
            printf("SLOWO %d wiadomosci = %c\n", n, tymczasowa->slowo);
 
            n++;
 
            tymczasowa = tymczasowa->nastepna;
        }
    }
}
 
 
void usunac_Z_Poczatku()
{
    struct wiadomosc * Usunac;
 
    if(pierwsza == NULL)
    {
        printf("Niemozliwe usunac. Lista jest pusta.\n");
    }
    else
    {
        Usunac = pierwsza;
 
        pierwsza = pierwsza->nastepna; 
        pierwsza->poprzednia = NULL; 
 
        free(Usunac); 
        printf("Pomyslnie usunieto wiadomosc z poczatku listy.\n");
    }
}
 
void usunac_Z_Konca()
{
    struct wiadomosc * Usunac;
 
    if(ostatnia == NULL)
    {
        printf("Niemozliwe usunac. Lista jest pusta.\n");
    }
    else
    {
        Usunac = ostatnia;
 
        ostatnia = ostatnia->poprzednia; 
        ostatnia->nastepna = NULL;
 
        free(Usunac); 
        printf("Pomyslnie usunieto wiadomosc z konca listy.\n");
    }
}
 

void usunac_Nta_wiadomosc(int pozycja)
{
    struct wiadomosc *obecna;
    int i;
 
    obecna = pierwsza;
    for(i=1; i<pozycja && obecna!=NULL; i++)
    {
        obecna = obecna->nastepna;
    }
 
    if(pozycja == 1)
    {
        usunac_Z_Poczatku();
    }
    else if(obecna == ostatnia)
    {
        usunac_Z_Konca();
    }
    else if(obecna != NULL)
    {
        obecna->poprzednia->nastepna = obecna->nastepna;
        obecna->nastepna->poprzednia = obecna->poprzednia;
 
        free(obecna); 
 
        printf("Pomyslnie usunieto wiadomosc z %d pozycji.\n", pozycja);
    }
    else
    {
        printf("Niewlasciwa pozycja!\n");
    }
} 
0
  1. Czemu słowo jest intem?
  2. Czemu przy tworzeniu nagle słowo jest znakiem char i jest przypisywane do inta?

Możesz konkretnie napisać co nie działa?

0

Mam taki program na inty, a potrzebuję na char, czyli chce wpisywać słowa do listy, a nie liczby.

#include <stdio.h>
#include <stdlib.h>
 
 
/*
 * Basic structure of Node
 */
struct node {
    int data;
    struct node * prev;
    struct node * next;
}*head, *last;
 
 
 
/*
 * Functions used in this program
 */
void createList(int n);
void displayList();
void deleteFromBeginning();
void deleteFromEnd();
void deleteFromN(int position);
 
 
 
int main()
{
    int n, data, choice=1;
 
    head = NULL;
    last = NULL;
 
    /*
     * Run forever until user chooses 0
     */
    while(choice != 0)
    {
        printf("============================================\n");
        printf("DOUBLY LINKED LIST PROGRAM\n");
        printf("============================================\n");
        printf("1. Create List\n");
        printf("2. Delete node - from beginning\n");
        printf("3. Delete node - from end\n");
        printf("4. Delete node - from N\n");
        printf("5. Display list\n");
        printf("0. Exit\n");
        printf("--------------------------------------------\n");
        printf("Enter your choice : ");
 
        scanf("%d", &choice);
 
        switch(choice)
        {
            case 1:
                printf("Enter the total number of nodes in list: ");
                scanf("%d", &n);
                createList(n);
                break;
            case 2:
                deleteFromBeginning();
                break;
            case 3:
                deleteFromEnd();
                break;
            case 4:
                printf("Enter the node position which you want to delete: ");
                scanf("%d", &n);
                deleteFromN(n);
                break;
            case 5:
                displayList();
                break;
            case 0:
                break;
            default:
                printf("Error! Invalid choice. Please choose between 0-5");
        }
 
        printf("\n\n\n\n\n");
    }
 
    return 0;
}
 
 
 
/**
 * Creates a doubly linked list of n nodes.
 *
 * @n Number of nodes to be created
 */
void createList(int n)
{
    int i, data;
    struct node *newNode;
 
    if(n >= 1)
    {
        /*
         * Creates and links the head node
         */
        head = (struct node *)malloc(sizeof(struct node));
 
        printf("Enter data of 1 node: ");
        scanf("%d", &data);
 
        head->data = data;
        head->prev = NULL;
        head->next = NULL;
 
        last = head;
 
        /*
         * Creates and links rest of the n-1 nodes
         */
        for(i=2; i<=n; i++)
        {
            newNode = (struct node *)malloc(sizeof(struct node));
 
            printf("Enter data of %d node: ", i);
            scanf("%d", &data);
 
            newNode->data = data;
            newNode->prev = last; //Links new node with the previous node
            newNode->next = NULL;
 
            last->next = newNode; //Links previous node with the new node
            last = newNode; //Makes new node as last node
        }
 
        printf("\nDOUBLY LINKED LIST CREATED SUCCESSFULLY\n");
    }
}
 
 
 
/**
 * Displays the content of the list from beginning to end
 */
void displayList()
{
    struct node * temp;
    int n = 1;
 
    if(head == NULL)
    {
        printf("List is empty.\n");
    }
    else
    {
        temp = head;
        printf("DATA IN THE LIST:\n");
 
        while(temp != NULL)
        {
            printf("DATA of %d node = %d\n", n, temp->data);
 
            n++;
 
            /* Moves the current pointer to next node */
            temp = temp->next;
        }
    }
}
 
 
 
/**
 * Deletes or removes the first node of the doubly linked list
 */
void deleteFromBeginning()
{
    struct node * toDelete;
 
    if(head == NULL)
    {
        printf("Unable to delete. List is empty.\n");
    }
    else
    {
        toDelete = head;
 
        head = head->next; //Move head pointer to 2 node
        head->prev = NULL; //Remove the link to previous node
 
        free(toDelete); //Delete the first node from memory
        printf("SUCCESSFULLY DELETED NODE FROM BEGINNING OF THE LIST.\n");
    }
}
 
 
 
/**
 * Deletes or removes the last node of the doubly linked list
 */
void deleteFromEnd()
{
    struct node * toDelete;
 
    if(last == NULL)
    {
        printf("Unable to delete. List is empty.\n");
    }
    else
    {
        toDelete = last;
 
        last = last->prev; //Move last pointer to 2nd last node
        last->next = NULL; //Remove link to of 2nd last node with last node
 
        free(toDelete); //Delete the last node
        printf("SUCCESSFULLY DELETED NODE FROM END OF THE LIST.\n");
    }
}
 
 
 
/**
 * Deletes or removes node from any position in the doubly linked list
 */
void deleteFromN(int position)
{
    struct node *current;
    int i;
 
    current = head;
    for(i=1; i<position && current!=NULL; i++)
    {
        current = current->next;
    }
 
    if(position == 1)
    {
        deleteFromBeginning();
    }
    else if(current == last)
    {
        deleteFromEnd();
    }
    else if(current != NULL)
    {
        current->prev->next = current->next;
        current->next->prev = current->prev;
 
        free(current); //Delete the n node
 
        printf("SUCCESSFULLY DELETED NODE FROM %d POSITION.\n", position);
    }
    else
    {
        printf("Invalid position!\n");
    }
} 
0

Jeśli chcesz wpisywać słowa i chcesz zrobić to w stylu C, to musisz stworzyć tablice charów więcej o tym możesz przeczytać np. TU.

Być może to jest problemem, choć nie gwarantuję, nie mam możliwości odpalenia programu i sprawdzenia co się dzieje... A też nie chcę wprowadzić w błąd Poczytaj o C-stringach, jak ich używać, zapoznaj się z funkcjami i spróbuj napisać to jeszcze raz :) Być może później coś uda mi się powiedzieć więcej.

0
//gcc 5.4.0

#include  <stdio.h>

struct Wiadomosc {
    char *slowo;
    struct wiadomosc * poprzednia;
    struct wiadomosc * nastepna;
};

void stworz_Liste(int n);
void drukuj_Liste();
void usun_Z_Poczatku();
void usun_Z_Konca();
void usun_Nta_wiadomosc(int pozycja);

int main(void)
{
    printf("Hello, world!\n");
    return 0;
}

void stworz_Liste(int n) {
int i;
    char slowo[255];
    struct wiadomosc *nowaWiadomosc;
 
    if(n >= 1)
    {
 
        pierwsza = (struct wiadomosc *)malloc(sizeof(struct wiadomosc));
 
        printf("Wprowadz slowo dla pierwszej wiadomosci: ");
        scanf("%s", &slowo);
 
        pierwsza->slowo = (char*)malloc(strlen(slowo)*(char));
        strcpy(pierwsza->slowo, slowo);
        pierwsza->poprzednia = NULL;
        pierwsza->nastepna = NULL;
 
        ostatnia = pierwsza;
 
        for(i=2; i<=n; i++)
        {
            nowaWiadomosc = (struct wiadomosc *)malloc(sizeof(struct wiadomosc));
 
            printf("Wprowadz slowo dla %d wiadomosci: ", i);
            scanf("%s", &slowo);
 
            nowaWiadomosc->slowo = (char*)malloc(strlen(slowo)*(char));
            strcpy(nowaWiadomosc->slowo, slowo);
            nowaWiadomosc->poprzednia = ostatnia; 
            nowaWiadomosc->nastepna = NULL;
 
            ostatnia->nastepna = nowaWiadomosc; 
            ostatnia = nowaWiadomosc; 
        }
 
        printf("\nLISTA DWUKIERUNKOWA POMYSLNIE STWORZONA\n");
    }
}

void drukuj_Liste()
{
    struct wiadomosc * tymczasowa;
    int n = 1;
 
    if(pierwsza == NULL)
    {
        printf("Lista jest pusta.\n");
    }
    else
    {
        tymczasowa = pierwsza;
        printf("Slowo w liscie:\n");
 
        while(tymczasowa != NULL)
        {
            printf("SLOWO %d wiadomosci = %s\n", n, tymczasowa->slowo);
 
            n++;
 
            tymczasowa = tymczasowa->nastepna;
        }
}
    
void usun_Z_Poczatku()
{
    struct wiadomosc * Usunac;
 
    if(pierwsza == NULL)
    {
        printf("Niemozliwe usunac. Lista jest pusta.\n");
    }
    else
    {
        Usunac = pierwsza;
 
        pierwsza = pierwsza->nastepna; 
        pierwsza->poprzednia = NULL; 
 
        free(Usunac->slowo); 
        free(Usunac);
        printf("Pomyslnie usunieto wiadomosc z poczatku listy.\n");
    }
}
    
void usunac_Z_Konca()
{
    struct wiadomosc * Usunac;
 
    if(ostatnia == NULL)
    {
        printf("Niemozliwe usunac. Lista jest pusta.\n");
    }
    else
    {
        Usunac = ostatnia;
 
        ostatnia = ostatnia->poprzednia; 
        ostatnia->nastepna = NULL;
 
        free(Usunac->slowo); 
        free(Usunac);
        printf("Pomyslnie usunieto wiadomosc z konca listy.\n");
    }
}
    
void usunac_Nta_wiadomosc(int pozycja)
{
    struct wiadomosc *obecna;
    int i;
 
    obecna = pierwsza;
    for(i=1; i<pozycja && obecna!=NULL; i++)
    {
        obecna = obecna->nastepna;
    }
 
    if(pozycja == 1)
    {
        usunac_Z_Poczatku();
    }
    else if(obecna == ostatnia)
    {
        usunac_Z_Konca();
    }
    else if(obecna != NULL)
    {
        obecna->poprzednia->nastepna = obecna->nastepna;
        obecna->nastepna->poprzednia = obecna->poprzednia;
 
        free(obecna->slowo); 
        free(obecna);
        printf("Pomyslnie usunieto wiadomosc z %d pozycji.\n", pozycja);
    }
    else
    {
        printf("Niewlasciwa pozycja!\n");
    }
} 

Poprawiłem kod, ale tak jak mówię, nie odpalałem ani twojej wersji, ani "mojej", więc może to mimo wszystko nie działać :p

1 użytkowników online, w tym zalogowanych: 0, gości: 1