【问题标题】:Append Struct object into LinkedList - C将结构对象附加到 LinkedList - C
【发布时间】:2021-11-27 21:40:09
【问题描述】:

我正在尝试将结构对象附加到链表。从标准输入读取数据。 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;
}

【问题讨论】:

  • 错误信息属于标准错误:fprintf(stderr, "%s", "delElement: No entry or List found\n");
  • 感谢您指出这一点:)

标签: c pointers linked-list dynamic-memory-allocation singly-linked-list


【解决方案1】:

这句话之后

event->name = eventName;

在while循环中

while(fgets(buffer, 256, stdin) != NULL){

指针name 指向同一个数组eventName。所以存储在数组eventName 中的最后一个字符串会显示给所有节点,因为所有节点都指向这个数组。

您需要为每个节点中的字符数组动态分配内存,并将数组eventName中存储的字符串复制到这个动态分配的数组中。

【讨论】:

  • 非常感谢!这有效!我做 char *tmp = malloc(sizeof(eventName)),然后是 strcpy(tmp, eventName),最后是 event->name = tmp。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
相关资源
最近更新 更多