【问题标题】:Segfault inserting into linked list of customers插入客户链表的段错误
【发布时间】:2021-07-07 19:48:24
【问题描述】:

我想创建一个堆栈,但我想像链表实现一样保留头指针。我的意思是直接结束对面的堆栈。

void insertCustomer(CustomerPtr *headPtr, int id, char name[20], char surname[20]){

    CustomerPtr newPtr = (CustomerPtr)malloc(sizeof(Customer));
    newPtr->customerId = id;
    strcpy(newPtr->customerName, name);
    strcpy(newPtr->customerSurname, surname); 
    CustomerPtr previousPtr, currentPtr;
    previousPtr = NULL;
    currentPtr = *headPtr;
    while(currentPtr != NULL){
        previousPtr = currentPtr;
        currentPtr = currentPtr->next; 
    }
    if(previousPtr == NULL){  
        *headPtr = newPtr;
    } else{
        previousPtr->next = newPtr;
    } 
    
} 

我遇到了分段错误。

【问题讨论】:

  • 但是我遇到了分段错误
  • 如果customerNamechar*strcpy(newPtr->customerName, name); 可能是分段错误的原因。
  • @berkay_K 这似乎是“我的意思是去头到尾相反的堆栈。”没有意义。如果你想实现一个堆栈那么新的节点,必须放在列表的开头。

标签: c linked-list stack


【解决方案1】:

您似乎忘记初始化newPtr->next。通过malloc() 分配的区域的初始值是不确定的,使用不确定的值会调用未定义的行为

void insertCustomer(CustomerPtr *headPtr, int id, char name[20], char surname[20]){

    CustomerPtr newPtr = (CustomerPtr)malloc(sizeof(Customer));
    newPtr->customerId = id;
    strcpy(newPtr->customerName, name);
    strcpy(newPtr->customerSurname, surname); 
    newPtr->next = NULL; /* add this */
    CustomerPtr previousPtr, currentPtr;
   /* ... */

【讨论】:

  • 问题表明它正在尝试实现堆栈,因此 insert 应该插入到前面,而不是末尾。
  • @rcgldr 您应该在对作者问题的评论中将此作为问题提出。
  • 问题的前几句话是“我想创建一个堆栈......”。
【解决方案2】:

如果目标是使用链表实现栈,那么insert|push需要将新节点插入到链表的开头,而不是追加到链表的末尾,而remove|pop需要删除列表的第一个节点。像这样的插入:

    CustomerPtr newPtr = (CustomerPtr)malloc(sizeof(Customer));
    newPtr->customerId = id;
    strcpy(newPtr->customerName, name);
    strcpy(newPtr->customerSurname, surname); 
    newPtr->next = *headPtr;
    *headPtr = newPtr;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-11
    • 2014-06-04
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 2016-02-05
    相关资源
    最近更新 更多