2015-05-17 44 views
-1

嗯,我有一個按字母順序在列表中插入新結構體的代碼,但我遇到了一些問題。我可以讓它工作有一個功能,當我打電話時,我讓head = Insert(frota * head,char name)。該代碼是休耕如何按字母順序在列表中插入一個結構體

typedef struct robot { 
    int bateria; 
    char nome[3]; 
    int pos_x; 
    int pos_y; 
    int target_x; 
    int target_y; 
    int limpos; 
    int percorridos; 
    struct robot * next; 
}frota; 

frota* Insert(frota* head, char name){ 
frota* temp = (frota*)malloc(sizeof(frota)); 
if(temp == NULL){ 
     printf("Unable to allocate memory for new node\n"); 
     exit(-1); 
} 
temp->nome[0] = 'R'; 
temp->nome[1] = name; 
int* prevtemp = head; 
int* nexttemp = head; 
if(head != NULL) 
    { 
     // Corner Case: First on the list 
     if(temp->nome[1] <= prevtemp->nome[1]) 
     { 
      head = temp; 
      temp->next = prevtemp; 
     } 
     else 
     { 
      // CASE: Somewhere between the first and the list 
      while(nexttemp->next != NULL) 
      { 
       nexttemp = nexttemp->next; 
       if(temp->nome[1] >= prevtemp->nome[1] && temp->nome[1] <= nexttemp->nome[1]) 
       { 
        prevtemp->next = temp; 
        temp->next = nexttemp; 
        break; 
       } 
       prevtemp = prevtemp->next; 
      } 

      // Corner Case: end of list 
      if(nexttemp->next == NULL) 
      { 
       nexttemp->next = temp; 
      } 
     } 
    } 
    else 
    { 
     // Corner Case: We had an empty list 
     head = temp; 
    } 
} 

我的問題是如何使代碼工作並直接改變值頭的價值,使這樣這個函數的過程。我嘗試過的代碼是這樣的:

void Insert(frota* head, char name){ 
frota* temp = (frota*)malloc(sizeof(frota)); 
if(temp == NULL){ 
     printf("Unable to allocate memory for new node\n"); 
     exit(-1); 
} 
temp->nome[0] = 'R'; 
temp->nome[1] = name; 
int* prevtemp = *head; 
int* nexttemp = *head; 
if(*head != NULL) 
    { 
     // Corner Case: First on the list 
     if(temp->nome[1] <= prevtemp->nome[1]) 
     { 
      *head = temp; 
      temp->next = prevtemp; 
     } 
     else 
     { 
      // CASE: Somewhere between the first and the list 
      while(nexttemp->next != NULL) 
      { 
       nexttemp = nexttemp->next; 
       if(temp->nome[1] >= prevtemp->nome[1] && temp->nome[1] <= nexttemp->nome[1]) 
       { 
        prevtemp->next = temp; 
        temp->next = nexttemp; 
        break; 
       } 
       prevtemp = prevtemp->next; 
      } 

      // Corner Case: end of list 
      if(nexttemp->next == NULL) 
      { 
       nexttemp->next = temp; 
      } 
     } 
    } 
    else 
    { 
     // Corner Case: We had an empty list 
     *head = temp; 
     (*head)->next = NULL; 
    } 
} 

這樣,我CAL的程序相同插入(&頭,名稱)。任何幫助將不勝感激。當我運行的代碼出現分段錯誤,而不是吶內存錯誤 PS:該代碼是不完全我的責任,發現了一些部分在線....

感恩

+1

您是否收到錯誤消息?或者一個seg故障? 「這段代碼不運行」是什麼意思? – user1717828

+2

這看起來很糟糕:'int * prevtemp = head;'('head'是'frota **')。 – alk

+0

另外,它看起來好像所有的'頭部'的分配都應該改變爲'(* head)'的分配,否則它們根本就沒有意義,而反過來挑起UB。 – alk

回答

0

對於初學者:

更改

int* prevtemp; 

struct robot * prevtemp; 

(同爲nexttemp


改變所有

head 

(*head) 

改變所有

frota 

struct robot 
+0

但是改我的頭(*頭)我不會改變頭的價值? –

+0

@luisdias:我懷疑它會。可以肯定的是,您可能想向我們展示如何調用Insert()。 – alk

+0

插入(&head,name)。我認爲它會......因爲在我的代碼中,我正在改變指針頭的位置....你所提到的一些修改不會有這樣的區別:「frota * temp to struct robot *溫度;」。 –