2014-10-01 27 views
0

我有一个C程序,它创建了一个两部分单向链表。
我使用结构来生成列表,节点和节点数据。 当结构被定义为C结构段溢出

struct TList { 
    struct LNode* first; 
    struct LNode* last_left; 
}; 

struct LNode { 
    struct LData* data; 
    struct LNode* next; 
}; 

名单看​​起来像[ A B C ][ D E ] 其中, list->first = "A"list->last_left = "C"

下列功能重置链表光标。

void reset_list_cursor(struct TList *list) { 

    struct LNode *temp, *temp1, *temp2; 
    int i = (list_left_size(list) - 1); 

    for (i; i >= 0; i--) { 

     temp = list->last_left; 
     temp1 = list->first; 

     if (temp != NULL) { 

      temp2 = temp1->next; 
      while (temp2 != temp) { 
       temp1 = temp1->next; 
       temp2 = temp2->next; 
      } 

      list->last_left = temp1; 
     } 
    } 
    list->last_left = NULL; 
} 

但是,我得到一个分段错误,我已经把范围缩小寿以下行...

void reset_list_cursor(struct TList *list) { 

    temp1 = temp1->next; 
    temp2 = temp2->next; 

我知道你永远不能叫temp = temp->next->next,但是当你创建一个结构代替temp->next不应该工作吗?

+6

如果知道temp和temp-> next不是NULL(或者更确切地说,已知是有效的),则'temp = temp-> next-> next;'在​​句法上是有效的并且是安全的。 。 – 2014-10-01 20:08:17

+1

这意味着你取消了'NULL'。先不检查'NULL',你可以避免它。 – HuStmpHrrr 2014-10-01 20:25:50

+1

[MCVE](http://stackoverflow.com/help/mcve)会有所帮助。 – 2014-10-01 21:11:13

回答

0

首先,temp - > next - > next没有问题,它的语法也是正确的。在涉及循环的任何情况下,你必须确保你在进入时确认“next”是否为空。包括一个条件,当你进入循环时检查temp - > next == NULL。这会为你创造奇迹。

这有点像while(temp1->next!=NULL && temp2->next!=NULL)

希望这有助于。