База данных названий песен с двусвязным списком

Я новичок на сайте, и мне нужна помощь в отношении двусвязного списка, в котором хранятся Mp3 с именем исполнителя, названием песни, названием альбома, датой и временем воспроизведения. Если бы вы могли помочь мне вообще, я был бы признателен. Я получаю segfault в соответствии с GDB в моей функции добавления.

Предупреждения также следующие:

Description Resource    Path    Location    Type
'data' is used uninitialized in this function [-Wuninitialized] Mp3.c   /OperatingSystemsLab1   
line 7  C/C++ Problem
assignment makes pointer from integer without a cast [enabled by default]   Mp3.c   /OperatingSystemsLab1   
line 7  C/C++ Problem
implicit declaration of function 'malloc' [-Wimplicit-function-declaration] Mp3.c   /OperatingSystemsLab1   
line 21 C/C++ Problem
assignment makes pointer from integer without a cast [enabled by default]   Mp3.c   /OperatingSystemsLab1   
line 8  C/C++ Problem
implicit declaration of function 'free' [-Wimplicit-function-declaration]   Mp3.c   /OperatingSystemsLab1   
line 40 C/C++ Problem
incompatible implicit declaration of built-in function 'malloc' [enabled by default]    Mp3.c   /OperatingSystemsLab1   
line 21 C/C++ Problem
incompatible implicit declaration of built-in function 'malloc' [enabled by default]    Mp3.c   /OperatingSystemsLab1   
line 57 C/C++ Problem
incompatible implicit declaration of built-in function 'free' [enabled by default]  Mp3.c   /OperatingSystemsLab1   
line 40 C/C++ Problem

Мой код выглядит следующим образом

#include <stdio.h>
#include "Mp3.h"



void add(struct MP3 *pointer, char artistname, char albumname, char songname, int date, int runtime){
    /*make structure for new data*/
struct MP3 *data;
data->artistName = artistname;
data->albumName = albumname;
data->date=date;
data->runTime=runtime;
data->next=NULL;
data->prev=NULL;

if(pointer->next==NULL) {
    pointer->next = data;
}
else {
        while(pointer->next != NULL){
        pointer = pointer->next;
    }
    pointer->next = (struct MP3*)malloc(sizeof(struct MP3));
    pointer->next = data;
    struct MP3 *temp = pointer;
    pointer = pointer->next;
    pointer->prev = temp;
}
};



void delete(struct MP3 *pointer, char *artistname){
while(pointer->next!=NULL && (pointer->next)->artistName!=artistname){
    pointer = pointer->next;
}
if(pointer->next==NULL){
    return;
}
struct MP3 *temp;
temp = pointer->next;
pointer->next = temp->next;
pointer->next->prev = pointer;
free(temp);
};



void print(struct MP3 *pointer){
if(pointer==NULL){
    return;
}
printf("Artist name: %s \n", pointer->artistName);
printf("Album name: %s \n", pointer->albumName);
printf("Title: %s \n", pointer->songName);
printf("Date: %d \n", pointer->date);
printf("Runtime: %d\n", pointer->runTime);

print(pointer->next);
};



int main(){
struct MP3 *start,*current;
start = (struct MP3 *)malloc(sizeof(struct MP3));
current = start;
current->next = NULL;
current->prev = NULL;

printf("1. Add\n");
printf("2. Delete\n");
printf("3. Print\n");
while(1)
{
    int query;
    scanf("%d",&query);
    if(query==1)
    {
        int rt,d;
        char artn,albn,sn;
        scanf("%c %c %c %d %d",&artn,&albn,&sn,&d,&rt);
        add(start,artn,albn,sn,d,rt);
    }
    else if(query==2)
    {
        char artn;
        scanf("%c",&artn);
        delete(start,&artn);
    }
    else if(query==3)
    {
        printf("The list is ");
        print(start->next);
        printf("\n");
    }
}
};

И заголовочный файл

#ifndef MP3_H_
#define MP3_H_

struct MP3{
char *artistName;
char *albumName;
char *songName;
int date;
int runTime;
struct MP3 *next;
struct MP3 *prev;

};


#endif /* MP3_H_ */

Как я уже сказал, я новичок, так что помилуй меня. Любая помощь вообще будет оценена! Благодарю вас!


person Community    schedule 02.09.2012    source источник


Ответы (3)


У вас есть проблема здесь

struct MP3 *data;
data->artistName = artistname;

вы объявляете указатель на MP3, но не выделяете для него память. Используйте malloc для выделения пространства или вместо этого просто используйте простой экземпляр.

У вас тоже есть проблема здесь

 pointer->next = (struct MP3*)malloc(sizeof(struct MP3));

это выделяет память и устанавливает pointer->next для указания на нее. Затем в следующей строке

 pointer->next = data;

вы переназначаете pointer->next и так, чтобы выделенная память в предыдущей строке больше не имела своего адреса, сохраняемого какой-либо переменной - результатом этого является утечка памяти.

person mathematician1975    schedule 02.09.2012
comment
Итак, в добавлении я изменил его на struct MP3 *data; данные = malloc (sizeof (структура MP3)); data-›artistName = имя исполнителя; Но он все еще не работает должным образом -__________- - person ; 03.09.2012
comment
Вы изменили это во ВСЕХ функциях, где у вас есть нераспределенная память? - person mathematician1975; 03.09.2012
comment
Я также избавился от кода pointer-›malloc, закомментировав его. Теперь я получаю код для фактического запуска и печати списка, но скажем так, это нежелательно... вообще. Рофл. Спасибо за вашу помощь. - person ; 03.09.2012
comment
@Nick Вы получаете ошибки или предупреждения? Что бы вы ни делали, пожалуйста, НЕ редактируйте свой вопрос, чтобы добавить новые ошибки - это приводит к большому количеству путаницы. Если ошибок много, возможно, стоит открыть новый вопрос с новым обновленным кодом. Использование malloc определенно необходимо в вашем коде. - person mathematician1975; 03.09.2012
comment
Я больше не получаю segfault. Это просто вопрос получения данных прямо сейчас и правильной распечатки списка. Я намного дальше, чем я был. - person ; 03.09.2012
comment
Я получил все, чтобы работать раньше сегодня. Спасибо за вашу помощь. Я очень ценю это! - person ; 04.09.2012

структура MP3 *данные;

объявляет указатель на структуру данных, но не создает структуру. Поэтому, когда вы пытаетесь получить к нему доступ, вы получаете доступ к нераспределенной памяти, что вызывает ошибку сегментации. Вам нужно выделить память с помощью malloc:

struct MP3 *data; /* declares a pointer to a MP3 structure */
data = malloc(sizeof(MP3)); /* creates a new MP3 structure and makes the pointer point to it */
data->artistName = artistname; /* the structure can now be used */
person Philipp    schedule 02.09.2012

Как говорится в сообщении об ошибке - "'data' is uninitialized in this function" - что, очевидно, верно. Вы объявляете указатель на структуру MP3 с именем 'data'. Вы никогда не инициализируете указатель, выделяя память и инициализируя указатель так, чтобы он указывал на эту память.

person zxcdw    schedule 02.09.2012