将 Struct 对象附加到 LinkedList - C
Append Struct object into LinkedList - C
我正在尝试将结构对象附加到链表。从标准输入读取数据。 int 属性被正确附加,但之前附加的所有 char * 值不断被新输入替换。
我的 append 和 getElement 函数可以正常用于字符串输入。
这是我的代码:
#include "List.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct EventObj{
char *name;
int time;
} EventObj;
typedef EventObj* EventPtr;
void add(ListPtr a, EventObj *event);
void printTime(ListPtr a);
int main(int argc, char **argv) {
ListPtr a1 = newList(0, NULL, NULL);
char func[10], agenda[256], eventName[256], buffer[256];
int time;
printf("%s\n", "Begin reading inputs and appending events");
while(fgets(buffer, 256, stdin) != NULL){
sscanf(buffer, "%s %s %s %d", func, agenda, eventName, &time);
EventPtr event = malloc(sizeof(*event));
event->time = time;
event->name = eventName;
printf("%d ", event->time);
printf("%s\n", event->name);
appendList(a1, event);
}
printf("%s\n", "Print from the list after appending");
printTime(a1);
}
void printTime(ListPtr a){
for (int i=0; i <length(a); i++){
EventPtr cur = getElement(a, i);
printf("%d ", cur->time);
printf("%s\n", cur->name);
}
}
输出:
Begin reading inputs and appending events
9 event1
10 event2
12 event3
8 event4
Print from the list after appending
9 event4
10 event4
12 event4
8 event4
// this should be event1 event2 event3 event4
追加函数:
bool appendList( ListPtr L, void *data ){
if(L == NULL){
printf("%s", "appendList: NULL List");
return false;
}
NodePtr node = newNode(data);
if(node == NULL){
printf("%s", "appendList: NULL Node");
return false;
}
node-> next = L -> head;
L -> head = node;
L ->length ++;
return true;
}
获取元素:
void *getElement( ListPtr L, int i){
if(L == NULL || i > L->length){
printf("%s", "delElement: No entry or List found\n");
return NULL;
}
NodePtr tmp = L-> head;
i = L->length - i - 1;
while(tmp != NULL && i > 0){
tmp = tmp -> next;
i --;
}
return tmp -> data;
}
这条语句之后
event->name = eventName;
在 while 循环中
while(fgets(buffer, 256, stdin) != NULL){
指针name
指向同一个数组eventName
。因此,存储在数组 eventName
中的最后一个字符串显示给所有节点,因为所有节点都指向该数组。
需要在每个节点动态分配一个字符数组内存,并将数组eventName
中存储的字符串复制到这个动态分配的数组中
我正在尝试将结构对象附加到链表。从标准输入读取数据。 int 属性被正确附加,但之前附加的所有 char * 值不断被新输入替换。
我的 append 和 getElement 函数可以正常用于字符串输入。
这是我的代码:
#include "List.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct EventObj{
char *name;
int time;
} EventObj;
typedef EventObj* EventPtr;
void add(ListPtr a, EventObj *event);
void printTime(ListPtr a);
int main(int argc, char **argv) {
ListPtr a1 = newList(0, NULL, NULL);
char func[10], agenda[256], eventName[256], buffer[256];
int time;
printf("%s\n", "Begin reading inputs and appending events");
while(fgets(buffer, 256, stdin) != NULL){
sscanf(buffer, "%s %s %s %d", func, agenda, eventName, &time);
EventPtr event = malloc(sizeof(*event));
event->time = time;
event->name = eventName;
printf("%d ", event->time);
printf("%s\n", event->name);
appendList(a1, event);
}
printf("%s\n", "Print from the list after appending");
printTime(a1);
}
void printTime(ListPtr a){
for (int i=0; i <length(a); i++){
EventPtr cur = getElement(a, i);
printf("%d ", cur->time);
printf("%s\n", cur->name);
}
}
输出:
Begin reading inputs and appending events
9 event1
10 event2
12 event3
8 event4
Print from the list after appending
9 event4
10 event4
12 event4
8 event4
// this should be event1 event2 event3 event4
追加函数:
bool appendList( ListPtr L, void *data ){
if(L == NULL){
printf("%s", "appendList: NULL List");
return false;
}
NodePtr node = newNode(data);
if(node == NULL){
printf("%s", "appendList: NULL Node");
return false;
}
node-> next = L -> head;
L -> head = node;
L ->length ++;
return true;
}
获取元素:
void *getElement( ListPtr L, int i){
if(L == NULL || i > L->length){
printf("%s", "delElement: No entry or List found\n");
return NULL;
}
NodePtr tmp = L-> head;
i = L->length - i - 1;
while(tmp != NULL && i > 0){
tmp = tmp -> next;
i --;
}
return tmp -> data;
}
这条语句之后
event->name = eventName;
在 while 循环中
while(fgets(buffer, 256, stdin) != NULL){
指针name
指向同一个数组eventName
。因此,存储在数组 eventName
中的最后一个字符串显示给所有节点,因为所有节点都指向该数组。
需要在每个节点动态分配一个字符数组内存,并将数组eventName
中存储的字符串复制到这个动态分配的数组中