使用空链接列表避免分段错误

时间:2016-03-02 04:52:13

标签: c list pointers queue

我在C中有一个List,其中包含以下数据结构:

typedef struct node{
    int in_id;
    struct node *next; 
} Node;

typedef struct List{
    Node* head;
    Node* tail;
}List;

如果列表被占用,我查看列表前面的功能可以正常工作,但是,如果列表为空并且我在列表中查看,则会收到分段错误。这是完全可以理解的。但是,我一直试图想办法防止这种情况或绕过分割错误。

Node* front(List *q){
Node *temp;
temp = NULL;
if(q->head == NULL && q->tail == NULL){
    printf("front function: this is empty \n");
    return temp;
}
else{
    temp = q->head;
    return temp;
    }
}

第一个想法是,如果我需要在if(front(Node)->value == x)中使用front,如果它为空则会出现分段错误。但是,我通过在前面if( something == TRUE && front(Node)->value == x)之前添加我需要测试的其他内容来使其短路。 我还想到做的是malloc()前面temp的一些动态内存,并指定我正在测试的相关字段,如果head && tail == NULL,我知道这个值是假的。但是,我觉得这是内存泄漏,因为我无法free() temp

我是否有更好的方法来处理窥视此队列而不会出现分段错误,如果它是空的?

2 个答案:

答案 0 :(得分:1)

我认为你在单行函数调用中试图做太多。 front(Node)->value始终会尝试取消引用从该函数返回的任何内容,即使它是NULL,因此当列表为空并返回NULL时会出现seg错误。您需要拆分该行。首先从调用front(...)检索指针,然后检查NULL,如果不是NULL,则继续解除引用:

 Node* temp = front(list);
 if (temp != NULL)
 {
   // proceed with dereference
   if (temp->value == x) // this won't seg fault, do whatever with it
   {
      // ...
   }
 }
 else
 {
   // print error or do nothing
 }

可能有一种更聪明的方法可以单线化,但是如果你陷入困境并且没有严格的线路要求,那真的值得吗?

答案 1 :(得分:0)

如果链表为空,则头节点始终为空。并在您的函数中检查空节点的head head和tail元素。这就是你的分段错误的原因。

试试下面的功能

  Node* front(List *q){
  Node *temp;
  temp = NULL;
  if(q == NULL){
     printf("front function: this is empty \n");
     return temp;
   }
 else{
   temp = q->head;
    return temp;
   } 
 }