我一直在尝试创建一个专辑目录,其中链表上的每个节点都有一个索引(代码),艺术家的名字和专辑的版本。但是,出于某种原因,每次我尝试打印列表时,它都会显示我为每个节点指定的正确索引,但是对于每个项目,显示的艺术家和tytle将是我为此输入的那些最后一个节点也就是说,如果我为一个节点输入'1,Oasis和Definetely_Maybe',为第二个节点输入'5,Aerosmith和Pump',当我运行print_list时,它将显示
Code: 1
Artist: Aerosmith
Album: Pump
和
Code: 5
Artist: Aerosmith
Album: Pump
不知何故,它用最后一个覆盖了第一个节点的艺术家和专辑。无论在我结束运行之前输入了多少节点,都会发生这种情况。
我知道这是非常新手,但我刚刚开始编程,非常感谢帮助。代码如下。非常感谢。
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
typedef struct n {int code; char *artist; char *album; struct n* next;} Node;
void start_list (Node **first);
Node *create_node (int code, char *art, char *alb);
void insert_list (Node **first, Node *next);
void print_list (Node *p);
void exit_list (Node **p);
int main(int argc, char *argv[])
{
Node *first;
Node *new;
int n;
char artist[MAX];
char album[MAX];
start_list(&prim);
do{
printf("Please enter a number for the next Node or 0 to exit the list: ");
scanf("%d",&n);
if(n==0)break;
printf("\nNow enter the artist's name: ");
scanf("%s",&artist);
printf("\nType the album tytle now: ");
scanf("%s",&album);
printf("\n\nCode: %d ",n);
printf("\nArtist: %s ",artist);
printf("\nAlbum: %s \n",album);
new=create_node(n,artist,album);
insert_list(&first,new);
}while(n!=0);
print_list (prim);
exit_list(&prim);
system("PAUSE");
return 0;
}
void start_list (No **prim){
*prim=NULL;
}
Node *create_node (int code, char *art, char *alb){
Node *new;
new=(Node*)malloc(sizeof(Node));
new->code=code;
new->artist=art;
new->album=alb;
new->next=NULL;
return new;
}
void insert_list (Node **first, Node *new){
new->next=*first;
*first=new;
}
void print_list (Node *p){
Node *aux=p;
while (aux!=NULL){
printf("\n\nCode: %d ",aux->code);
printf("\nArtist: %s ",aux->artist);
printf("\nAlbum: %s \n",aux->album);
aux=aux->next;
}
}
void exit_list (Node **p){
Node *aux=*p;
while(aux!=NULL){
*p=(*p)->next;
free(aux);
aux=*p;
}
}
答案 0 :(得分:1)
Node* first = NULL;
new->artist = strdup(art);
new->album = strdup(alb);
并在exit_list中释放它们,就在free(aux)
之前。
free(aux->art);
free(aux->alb);
free(aux);
答案 1 :(得分:0)
您的create_node函数将char指针艺术家和专辑设置为指向main函数中的艺术家和专辑数组。每次迭代只会重写存储在这些数组中的内容。因此,每个节点都指向相同的字符串,并且在您的过程结束时,最近输入的字符串位于数组中。
您需要为每个新字符串分配(例如,使用malloc或使用堆的字符串函数)存储,以便字符串在调用之间保持不变,并且不会被覆盖。