2014-09-19 65 views
-1

我的程序在特定的實例/情況下崩潰,否則它遵循並運行正常。 我們得到了格式化,像這樣的文本文件:鏈接列表文本文件循環

12 JackSprat 2  1 65000 

13 HumptyDumpty 5 3 30000 

17 BoPeep  2  3 30000 

20 BoyBlue 3  2 58000 

0 

我們需要從文件中讀取和使用鏈表存儲到一個結構。到目前爲止,我的代碼如下所示:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define NAME_LENGTH 20 

typedef struct employeeData 
{ 
    int EMP_ID; 
    char* Name; 
    int Dept; 
    int Rank; 
    double Salary; 

    struct employeeData *next; 
}employee; 

employee* InitializeList(int EMP_ID, char* Name, int Dept, int Rank, double Salary) 
{ 
    employee* ptr = (employee*)(malloc(sizeof(struct employeeData))); 
    ptr->Name = (char*)malloc(sizeof(char)*NAME_LENGTH); 

    strcpy(ptr->Name, Name); 
    ptr->EMP_ID = EMP_ID; 
    ptr->Dept = Dept; 
    ptr->Rank = Rank; 
    ptr->Salary = Salary; 
    ptr->next = NULL; 

    return ptr; 
} 

employee* insert_by_employee(employee* head, employee* ptr) 
{ 
    employee* current = NULL; 
    current = head; 
    if(current == NULL || strcmp(current->Name, ptr->Name) > 0) 
    { 
      ptr->next = current; 
      return ptr; 
    } 
    else 
    { 
      while(current->next != NULL && strcmp(current->next->Name, ptr->Name) < 0) 
      { 

        current = current->next; 
      } 
    } 
      ptr->next = current->next; 
      current->next = ptr; 
      return head; 

} 

void query(employee *head, int submenu) 
{ 
    printf("\nEmp name\n"); 
    employee* current; 
    current = head; 
    while (current != NULL) 
    { 
     if(current->Rank == submenu) 
     { 
      printf("%s\n", current->Name); 
      current = current->next; 
     } 
     current = current->next; 
    } 
    return; 
} 

void printlist(employee* head) 
{ 
    employee* current; 
    current = head; 
    printf("EMP_ID\t EMP NAME\t\t DEPT\t\t RANK\t\t SALARY "); 
    while (current != NULL) 
    { 
     printf("\n%d\t %s \t\t %d\t\t %d\t\t %d\n", current->EMP_ID, current->Name, current->Dept, current->Rank, current->Salary); 
     current = current->next; 
    } 
    return; 
} 

int main(void) 
{ 
    FILE* ifp = fopen("empInfo.txt", "r"); 
    int EMP_ID, Dept, Rank, menu_choice = -1, submenu; 
    double Salary; 
    char* Name = (char*)malloc(sizeof(char*)*NAME_LENGTH); 

    employee *head = NULL; 

    while(!feof(ifp)) 
    { 
     fscanf(ifp, "%d %s %d %d %d", &EMP_ID, Name, &Dept, &Rank, &Salary); 
      { 
       if (EMP_ID == 0) 
        break; 
      } 
      employee* hold = InitializeList(EMP_ID, Name, Dept, Rank, Salary); 
      head = insert_by_employee(head, hold); 
    } 

    while (menu_choice != 0) 
    { 
     printf("\nPlease select an action from the following menu\n"); 
     printf("1 to add a new employee\n"); 
     printf("2 to delete an employee\n"); 
     printf("3 to modify an employee record\n"); 
     printf("4 to query employees by rank\n"); 
     printf("5 to print all employee information\n"); 
     printf("0 (or any other number) to stop\n"); 
     scanf("%d", &menu_choice); 

     if(menu_choice == 1) 
     { 
      printf("choice 1\n"); 
      menu_choice = -1; 
     } 

     if (menu_choice == 2) 
     { 
      printf("Choice 2\n"); 
      menu_choice = -1; 
     } 

     if (menu_choice == 3) 
     { 
      printf("Choice 3\n"); 
      menu_choice = -1; 
     } 
     if (menu_choice == 4) 
     { 
      printf("Please provide rank that you would like to query.\n"); 
      scanf("%d", &submenu); 
      query(head, submenu); 
      menu_choice = -1; 
     } 
     if (menu_choice == 5) 
     { 
      printlist(head); 
      menu_choice = -1; 
     } 
    } 

    fclose(ifp); 
    return 0; 
} 

我有我的查詢功能故障,該功能的工作原理除了當我查詢秩1,將打印JackSprats名字,那麼程序崩潰。沒有編譯器的錯誤不知道還有什麼錯誤。

編輯*解*

放置在if語句使斷裂確保環路是不是在最後一個節點。一旦循環命中最後一個節點,我有循環休息。

void query(employee *head, int submenu) 
{ 
    printf("\nEmp name\n"); 
    employee* current; 
    current = head; 
    while (current != NULL) 
    { 

      if(current->Rank == submenu) 
      { 
       printf("%s\n", current->Name); 
       if(current->next == NULL) 
       { 
       break; 
       } 
       current = current->next; 
      } 

    current = current->next; 
    } 
    return; 
} 

回答

0

JackSprat是在以下循環鏈表

的最後一個節點值,電流值設置爲最後一個節點作爲JackSprat秩1,並將其與最後的節點匹配。 現在將電流分配給下一個將使其成爲NULL,在此訪問電流崩潰後。 找到匹配項後,您需要跳出循環。

if(current->Rank == submenu) 
    { 
     printf("%s\n", current->Name); 
     current = current->next; 
     //replace above line with break; 
    } 
+0

最終將斷點放置在嵌套的if語句中,並帶有if語句。感謝幫助。 – 2014-09-22 00:02:53

0
while (current != NULL) 
{ 
    if(current->Rank == submenu) 
    { 
     printf("%s\n", current->Name); 
     current = current->next; 
    } 
    current = current->next; 
} 

風險做電流 - >下一步 - 下一步>,用一個空。更好:

while (current != NULL) 
{ 
    if(current->Rank == submenu) 
    { 
     printf("%s\n", current->Name); 
     break; 
    } 
    current = current->next; 
} 

也許做scanf("%19s")也。

+0

我之前有突破,但我遇到一個問題,當我查詢有超過1人已與if循環只會打印的第一人與等級內休息秩秩。即排名第3只打印bopeep。我在if語句中包含current = current-> next來打印所有等級的員工。 – 2014-09-20 15:28:48

+0

我看到錯誤發生在哪裏,謝謝。有關解決方案的任何建議?上述解決方案將無法正常工作,因爲我需要打印上述等級的所有員工。 – 2014-09-20 15:42:29

+0

只需將上面的突破部分省略即可。 ;) – 2014-09-22 08:43:18