将 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中存储的字符串复制到这个动态分配的数组中