Связанный список строк в C - PullRequest
0 голосов
/ 21 ноября 2011

Я новичок в связанном списке в C, и у меня проблема в том, что я пытаюсь создать связанный список строк, но когда я пытаюсь распечатать этот список, он печатает первый символ из двух разных строк.Я думаю, что я испортил некоторые указатели.Любая помощь, пожалуйста?Вот мой код ...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{
    typedef struct _song{char *songTitle; char *songAuthor; char *songNote; struct _song *next;}SONG;

    int songCount =4;


    char SongTitle[songCount];
    char AuthorName[songCount];
    char SongNotes[songCount];


    char songTitle0[21] = "19 problems";
    char songArtist0[21]="JayZ";
    char songNotes0[81]="JiggaWhoJiggaWhat";
    SongTitle[0]=*songTitle0;//points at string songTitle0
    AuthorName[0]=*songArtist0;
    SongNotes[0]=*songNotes0;

    char songTitle1[21] = "Cig Poppa";
    char songArtist1[21]="Biggie Smalls";
    char songNotes1[81]="I Luv it When you call me big poppa";
    SongTitle[1]=*songTitle1;
    AuthorName[1]=*songArtist1;
    SongNotes[1]=*songNotes1;

    SONG *CurrentSong, *header, *tail;

    int tempCount=0;
    header = NULL;

    for(tempCount=0;tempCount<songCount;tempCount++)
    {

        CurrentSong = malloc(sizeof(struct _song));
        CurrentSong->songTitle= &SongTitle[tempCount];
        CurrentSong->songAuthor=&AuthorName[tempCount];
        CurrentSong->songNote=&SongNotes[tempCount];

        if(header == NULL)
        {
            header=CurrentSong;//head points to first thing in memory
        }
        else
        {
            tail->next=CurrentSong;
        }
        tail = CurrentSong;//always the last thing in the list 
        tail->next=NULL;//the next pointer is null always

    }
    tempCount =0;
    for(CurrentSong=header; CurrentSong!=NULL; CurrentSong=CurrentSong->next)
                    {
                        printf("\n%d: ", tempCount);
                            printf("Title: %s ",CurrentSong->songTitle);


                        printf("Author: %s ",CurrentSong->songAuthor);
                        tempCount++;
                    }


    return 0;
}

Ответы [ 3 ]

0 голосов
/ 21 ноября 2011

Три переменные SongTitle, AuthorName и SongNotes представляют собой массив char, а не массив string. Вам нужно изменить их декларацию на:

char* SongTitle[songCount];
char* AuthorName[songCount];
char* SongNotes[songCount];

Затем вам нужно обновить их так:

SongTitle[0] = songTitle0;//points at string songTitle0
AuthorName[0] = songArtist0;
SongNotes[0] = songNotes0;

А при сохранении их в связанном списке:

    CurrentSong = malloc(sizeof(struct _song));
    CurrentSong->songTitle = SongTitle[tempCount];
    CurrentSong->songAuthor = AuthorName[tempCount];
    CurrentSong->songNote = SongNotes[tempCount];
0 голосов
/ 21 ноября 2011

Вы не должны использовать связанные списки.

Это

typedef struct list {
    void *data;
    struct list *next;
}
SONG *s = (SONG *)songList->data;

Аналогично, для клонирования строк вам нужно использовать strdup.

Например

s->songTitle = strdup(SongTitle);
s->songAuthor = strdup(AuthorName);
s->songNote = strdup(SongNotes);

Не забудьте free струны, как только вы закончите с ними.

0 голосов
/ 21 ноября 2011
SongTitle[0]=*songTitle0;//points at string songTitle0

Комментарий не соответствует действительности.Вы копируете первый символ songTitle0 в первую позицию SongTitle.

Ваша установка слишком сложна.Вы захотите просто присвоить songTitle0, без каких-либо * или &, элементу songTitle первой ссылки списка;оба типа char*, так что это просто копия указателя.Пропустите переменные SongTitle, AuthorName и SongNotes, они не имеют смысла.

...