2016-11-27 37 views
1

我在做一個基本的linked-list程序。現在我在main方法的下面有這個代碼來檢查列表操作是否有預期的結果。在插入和刪除列表中的元素後,檢查結果列表是否與預期列表相同

例如,當我在列表的開頭插入元素是{50, 70, 80, 100, 77, 200, 44, 70, 6, 0}。我期望這些元素列表{0, 6, 70, 44, 200, 77, 100, 80, 70, 50},然後我插入中間的元素是{5, 20, 10, 30, 7, 8, 2, 104, 1, 22},元素「200」後,我期望列表爲{0, 6, 70, 44, 200, 22, 1, 104, 2, 8, 7, 30, 10, 20, 5, 77, 100, 80, 70, 50}。當我在列表的末尾插入一個元素並進行刪除操作時,我也希望這樣做。

因此,我想在操作結果和預期結果相同時顯示消息「正確」,如果其不同,則顯示「不正確」。但我沒有成功做到這一點。你能幫助理解這可以實現嗎?

這是我的代碼,我有評論是什麼,我想實現我對於第一種情況的目標(插入的開始):

int main() 
{ 
    int i=0; 
    int listsize=10; 

    int arrBegining[] = {50, 70, 80, 100, 77, 200, 44, 70, 6, 0}; 
    int arrBeginingExpected[] = {0, 6, 70, 44, 200, 77, 100, 80, 70, 50}; 

    int arrMiddle[] = {5, 20, 10, 30, 7, 8, 2, 104, 1, 22}; 
    int arrMiddleExpected[] = {0, 6, 70, 44, 200, 22, 1, 104, 2, 8, 7, 30, 10, 20, 5, 77, 100, 80, 70, 50}; 

    int arrEnd[] = {40, 30, 20, 1, 7, 76, 4 , 0, 80, 2}; 
    int arrEndExpected[] = {0, 6, 70, 44, 200, 22, 1, 104, 2, 8, 7, 30, 10, 20, 5, 77, 100, 80, 70, 50, 40, 30, 20, 1, 7, 76, 4, 0, 80, 2}; 

    int arrDeleteSpecificExpected[] = {0, 6, 70, 44, 200, 22, 1, 104, 2, 8, 7, 30, 10, 20, 5, 77, 100, 80, 70, 50, 40, 30, 20, 1, 7, 4 , 0, 80 ,2}; 
    int arrDeleteFromEndExpected[] = {0, 6, 70, 44, 200, 22, 1, 104, 2, 8, 7, 30, 10, 20, 5, 77, 100, 80, 70, 50, 40, 30, 20, 1, 7, 4, 0}; 

    // int newArr[] = {}; 

    for(i=0;i<listsize;i++){ 
     insert_at_begning(arrBegining[i]); 
     // newArr[i] = arrBegining[i]; 
    } 
    // if(newArr == arrBegining){ 
     // printf("Correct"); 
    // } 

    // else{ 
     // printf(Incorrect); 
    // } 

    for(i=0;i<listsize;i++){ 
     insert_at_middle(arrMiddle[i], 200); 
    } 
    for(i=0;i<listsize;i++){ 
     insert_at_end(arrEnd[i]); 
    } 

    for(i=0;i<listsize;i++){ 
     delete_from_middle(76); 
    } 

    for(i=0;i<2;i++){ 
     delete_from_end(); 
    } 

    display_file(FILEDIR); 

    return 0; 
} 

Restant代碼,這個代碼工作,我只是在main方法的疑問:

void insert_at_begning(int value) 
{ 
    var=(struct node *)malloc(sizeof (struct node)); 
    var->data=value; 
    if(head==NULL) 
    { 
     head=var; 
     head->next=NULL; 
    } 
    else 
    { 
     var->next=head; 
     head=var; 
    } 
} 

void insert_at_end(int value) 
{ 
    struct node *temp; 
    temp=head; 
    var=(struct node *)malloc(sizeof (struct node)); 
    var->data=value; 
    if(head==NULL) 
    { 
     head=var; 
     head->next=NULL; 
    } 
    else 
    { 
     while(temp->next!=NULL) 
     { 
      temp=temp->next; 
     } 
     var->next=NULL; 
     temp->next=var; 
    } 
} 

void insert_at_middle(int value, int loc) 
{ 
    struct node *var2,*temp; 
    var=(struct node *)malloc(sizeof (struct node)); 
    var->data=value; 
    temp=head; 

    if(head==NULL) 
    { 
     head=var; 
     head->next=NULL; 
    } 
    else 
    { 
     while(temp->data!=loc) 
     { 
      temp=temp->next; 
     } 
     var2=temp->next; 
     temp->next=var; 
     var->next=var2; 
    } 
} 

int delete_from_middle(int value) 
{ 
    struct node *temp,*var; 
    temp=head; 
    while(temp!=NULL) 
    { 
     if(temp->data == value) 
     { 
      if(temp==head) 
      { 
       head=temp->next; 
       free(temp); 
       return 0; 
      } 
      else 
      { 
       var->next=temp->next; 
       free(temp); 
       return 0; 
      } 
     } 
     else 
     { 
      var=temp; 
      temp=temp->next; 
     } 
    } 
    printf("data deleted from list is %d",value); 
} 

int delete_from_end() 
{ 
    struct node *temp; 
    temp=head; 
    while(temp->next != NULL) 
    { 
     var=temp; 
     temp=temp->next; 
    } 
    if(temp ==head) 
    { 
     head=temp->next; 
     free(temp); 
     return 0; 
    } 
    printf("data deleted from list is %d",temp->data); 
    var->next=NULL; 
    free(temp); 
    return 0; 
} 

回答

0

首先,您需要創建一個鏈表,爲此我們應該定義一個新類型,它是我們列表的成員,並且可以鏈接到其他成員。它是這樣的:

typedef struct SMember{ 
    int data; 
    struct SMember *next; 
    struct SMember *previous; 
}Member; 

現在我們應該爲我們的列表中的頭數,並獲得插入要求第一和最後一個成員,是這樣的:

typedef struct sList{ 
    int count; 
    struct SMember *first; 
    struct SMember *last; 
}List; 

所以我們可以利用這一點:

#include <stdio.h> 

typedef struct SMember{ 
    int data; 
    struct SMember *next; 
    struct SMember *previous; 
}Member; 

typedef struct SListHeader{ 
    int count; 
    struct SMember *first; 
    struct SMember *last; 
}ListHeader; 

void InsertAtBegning(int value, ListHeader *list) 
{ 
    Member *newMember = (Member *)calloc(1, sizeof(Member)); 
    newMember->next=NULL; 
    newMember->previous=NULL; 

    newMember->data = value; 
    if(list->count==0) 
    { 
     list->count = 1; 
     list->first = newMember; 
     list->last = newMember; 
    } 
    else{ 
     Member *tempMember; 

     list->count++; 
     tempMember = list->first; 
     list->first = newMember; 
     newMember->next = tempMember; 
     tempMember->previous = newMember; 
    } 
} 

void InsertAtMiddle(int value, int middle, ListHeader *list) 
{ 
    Member *newMember = (Member *)calloc(1, sizeof(Member)); 
    newMember->next=NULL; 
    newMember->previous=NULL; 

    newMember->data = value; 
    if(list->count==0) 
    { 
     list->count = 1; 
     list->first = newMember; 
     list->last = newMember; 
     return; 
    } 
    else{ 
     int i; 
     Member *tempMember; 

     for(i=0, tempMember = list->first; i < list->count; i++, tempMember=tempMember->next) 
      if(tempMember->data == middle) 
      { 
       if(tempMember->next != NULL) 
       { 
        Member *tempMemberNext = tempMember->next; 
        tempMember->next = newMember; 
        newMember->next = tempMemberNext; 
        newMember->previous = tempMember; 
        tempMemberNext->previous = newMember; 
       } 
       else{ 
        tempMember->next = newMember; 
        newMember->previous = tempMember; 
        list->last = newMember; 
       } 
       list->count++; 
       return; 
      } 
     //if we dont find the middle member we dont insert this member! 
     free(newMember); 
    } 
} 

void InsertAtEnd(int value, ListHeader *list) 
{ 
    Member *newMember = (Member *)calloc(1, sizeof(Member)); 
    newMember->next=NULL; 
    newMember->previous=NULL; 

    newMember->data = value; 
    if(list->count==0) 
    { 
     list->count = 1; 
     list->first = newMember; 
     list->last = newMember; 
    } 
    else{ 
     Member *tempMember; 

     list->count++; 
     tempMember = list->last; 
     list->last = newMember; 
     newMember->previous = tempMember; 
     tempMember->next = newMember; 
    } 
} 

void DeleteFromMiddle(int middle, ListHeader *list) 
{ 
    if(list->count==0) 
    { 
     return; 
    } 
    int i; 
    Member *tempMember; 

    for(i=0, tempMember = list->first; i < list->count; i++, tempMember=tempMember->next) 
     if(tempMember->data == middle) 
     { 
      if(tempMember->next != NULL && tempMember->previous != NULL) 
      { 
       Member *tempMemberNext = tempMember->next; 
       Member *tempMemberPrevious = tempMember->previous; 
       tempMemberPrevious->next = tempMemberNext; 
       tempMemberNext->previous = tempMemberPrevious; 
      } 
      else if(tempMember->previous == NULL && tempMember->next == NULL) 
      { 
       list->first = NULL; 
       list->last = NULL; 
      } 
      else if(tempMember->next == NULL) 
      { 
       Member *tempMemberPrevious = tempMember->previous; 
       tempMemberPrevious->next = NULL; 
       list->last = tempMemberPrevious; 
      } 
      else if(tempMember->previous == NULL) 
      { 
       Member *tempMemberNext = tempMember->next; 
       tempMemberNext->previous = NULL; 
       list->first = tempMemberNext; 
      } 
      free(tempMember); 
      list->count--; 
      return; 
     } 
} 

void DeleteFromEnd(ListHeader *list) 
{ 
    if(list->count==0) 
    { 
     return; 
    } 
    else{ 
     Member *lastMember; 

     list->count--; 
     lastMember = list->last; 
     list->last = lastMember->previous; 
     if(lastMember->previous != NULL) 
     { 
      Member *beforeLastMember = lastMember->previous; 
      beforeLastMember->next = NULL; 
     } 
     free(lastMember); 
    } 
} 

void PrintList(ListHeader *list) 
{ 
    int i; 
    Member *tempMember; 

    for(i=0, tempMember = list->first; i<list->count; i++, tempMember = tempMember->next) 
    { 
     printf("Member [%d] = %d\n", i, tempMember->data); 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    ListHeader list; 
    list.count = 0; 
    list.first = NULL; 
    list.last = NULL; 

    InsertAtBegning(1, &list); 
    InsertAtBegning(2, &list); 
    InsertAtBegning(3, &list); 

    InsertAtMiddle(4, 1, &list); 
    InsertAtMiddle(5, 2, &list); 
    InsertAtMiddle(6, 5, &list); 

    InsertAtEnd(7, &list); 
    InsertAtEnd(8, &list); 
    InsertAtEnd(9, &list); 

    printf("==================================1\n"); 
    PrintList(&list); 

    DeleteFromMiddle(1, &list); 
    DeleteFromMiddle(2, &list); 
    DeleteFromMiddle(3, &list); 
    DeleteFromMiddle(4, &list); 
    DeleteFromMiddle(5, &list); 
    printf("==================================2\n"); 
    PrintList(&list); 
    DeleteFromMiddle(6, &list); 
    DeleteFromMiddle(7, &list); 
    DeleteFromMiddle(8, &list); 
    DeleteFromMiddle(9, &list); 
    printf("==================================3\n"); 
    PrintList(&list); 

    InsertAtBegning(1, &list); 
    InsertAtBegning(2, &list); 
    InsertAtBegning(3, &list); 

    DeleteFromEnd(&list); 

    printf("==================================4\n"); 
    PrintList(&list); 
} 

=========================================== ================

編輯

=========================================== ================

您的評論後,我做你的主要的一些變化,並增加了兩個功能,

請檢查了這一點

#include <stdio.h> 

typedef struct node 
{ 
    int data; 
    struct node *next; 
}; 

struct node *head; 

void insert_at_begning(int value) 
{ 
    struct node *var; 

    var=(struct node *)malloc(sizeof (struct node)); 
    var->data=value; 
    if(head==NULL) 
    { 
     head=var; 
     head->next=NULL; 
    } 
    else 
    { 
     var->next=head; 
     head=var; 
    } 
} 

void insert_at_end(int value) 
{ 
    struct node *temp, *var; 
    temp=head; 
    var=(struct node *)malloc(sizeof (struct node)); 
    var->data=value; 
    if(head==NULL) 
    { 
     head=var; 
     head->next=NULL; 
    } 
    else 
    { 
     while(temp->next!=NULL) 
     { 
      temp=temp->next; 
     } 
     var->next=NULL; 
     temp->next=var; 
    } 
} 

void insert_at_middle(int value, int loc) 
{ 
    struct node *var,*var2,*temp; 
    var=(struct node *)malloc(sizeof (struct node)); 
    var->data=value; 
    temp=head; 

    if(head==NULL) 
    { 
     head=var; 
     head->next=NULL; 
    } 
    else 
    { 
     while(temp->data!=loc) 
     { 
      temp=temp->next; 
     } 
     var2=temp->next; 
     temp->next=var; 
     var->next=var2; 
    } 
} 

int delete_from_middle(int value) 
{ 
    struct node *temp,*var; 
    temp=head; 
    while(temp!=NULL) 
    { 
     if(temp->data == value) 
     { 
      if(temp==head) 
      { 
       head=temp->next; 
       free(temp); 
       return 0; 
      } 
      else 
      { 
       var->next=temp->next; 
       free(temp); 
       return 0; 
      } 
     } 
     else 
     { 
      var=temp; 
      temp=temp->next; 
     } 
    } 
    printf("data deleted from list is %d\n",value); 
} 

int delete_from_end() 
{ 
    struct node *var, *temp; 
    temp=head; 
    while(temp->next != NULL) 
    { 
     var=temp; 
     temp=temp->next; 
    } 
    if(temp ==head) 
    { 
     head=temp->next; 
     free(temp); 
     return 0; 
    } 
    printf("data deleted from list is %d\n",temp->data); 
    var->next=NULL; 
    free(temp); 
    return 0; 
} 

int check_results(int expected[], int count) 
{ 
    struct node *temp; 
    int i; 

    if(head==NULL) 
     return -1; 

    if(expected[0]!=head->data) 
     return -1; 
    i=1; 
    temp = head->next; 
    while(temp->next != NULL && i<count) 
    { 
     temp = temp->next; 
     if(expected[i]!=temp->data) 
      return -1; 
     i++; 
    } 
    return 0; 
} 

void printResults() 
{ 
    struct node *temp; 

    if(head==NULL) 
     return; 

    temp = head; 
    printf("Results:"); 
    printf(" %d ", head->data); 
    temp = head; 
    while(temp->next != NULL) 
    { 
     temp = temp->next; 
     printf(" %d ", temp->data); 
    } 
    printf("\n"); 
} 

int main() 
{ 
    int i=0; 
    int listsize=10; 

    int arrBegining[] = {50, 70, 80, 100, 77, 200, 44, 70, 6, 0}; 
    int arrBeginingExpected[] = {0, 6, 70, 44, 200, 77, 100, 80, 70, 50}; 

    int arrMiddle[] = {5, 20, 10, 30, 7, 8, 2, 104, 1, 22}; 
    int arrMiddleExpected[] = {0, 6, 70, 44, 200, 22, 1, 104, 2, 8, 7, 30, 10, 20, 5, 77, 100, 80, 70, 50}; 

    int arrEnd[] = {40, 30, 20, 1, 7, 76, 4 , 0, 80, 2}; 
    int arrEndExpected[] = {0, 6, 70, 44, 200, 22, 1, 104, 2, 8, 7, 30, 10, 20, 5, 77, 100, 80, 70, 50, 40, 30, 20, 1, 7, 76, 4, 0, 80, 2}; 

    int arrDeleteSpecificExpected[] = {0, 6, 70, 44, 200, 22, 1, 104, 2, 8, 7, 30, 10, 20, 5, 77, 100, 80, 70, 50, 40, 30, 20, 1, 7, 4 , 0, 80 ,2}; 
    int arrDeleteFromEndExpected[] = {0, 6, 70, 44, 200, 22, 1, 104, 2, 8, 7, 30, 10, 20, 5, 77, 100, 80, 70, 50, 40, 30, 20, 1, 7, 4, 0}; 
    // int newArr[] = {}; 

    for(i=0; i<listsize; i++) 
    { 
     insert_at_begning(arrBegining[i]); 
    } 

    printResults(); 
    if(check_results(arrBeginingExpected, 10)) 
     printf("correct!\n"); 
    else 
     printf("incorrect!\n"); 

    for(i=0; i<listsize; i++) 
    { 
     insert_at_middle(arrMiddle[i], 200); 
    } 

    printResults(); 
    if(check_results(arrMiddleExpected, 20)) 
     printf("correct!\n"); 
    else 
     printf("incorrect!\n"); 

    for(i=0; i<listsize; i++) 
    { 
     insert_at_end(arrEnd[i]); 
    } 

    printResults(); 
    if(check_results(arrEndExpected, 30)) 
     printf("correct!\n"); 
    else 
     printf("incorrect!\n"); 

    for(i=0; i<listsize; i++) 
    { 
     delete_from_middle(76); 
    } 

    printResults(); 
    if(check_results(arrDeleteSpecificExpected, 29)) 
     printf("correct!\n"); 
    else 
     printf("incorrect!\n"); 

    for(i=0; i<2; i++) 
    { 
     delete_from_end(); 
    } 

    printResults(); 
    if(check_results(arrDeleteFromEndExpected, 27)) 
     printf("correct!\n"); 
    else 
     printf("incorrect!\n"); 

    //display_file(FILEDIR); 

    return 0; 
} 

結果是:

Results: 0 6 70 44 200 77 100 80 70 50 
correct! 
Results: 0 6 70 44 200 22 1 104 2 8 7 30 10 20 5 77 100 80 70 50 
correct! 
Results: 0 6 70 44 200 22 1 104 2 8 7 30 10 20 5 77 100 80 70 50 40 30 20 1 7 76 4 0 80 2 
correct! 
data deleted from list is 76 
data deleted from list is 76 
data deleted from list is 76 
data deleted from list is 76 
data deleted from list is 76 
data deleted from list is 76 
data deleted from list is 76 
data deleted from list is 76 
data deleted from list is 76 
Results: 0 6 70 44 200 22 1 104 2 8 7 30 10 20 5 77 100 80 70 50 40 30 20 1 7 4 0 80 2 
correct! 
data deleted from list is 2 
data deleted from list is 80 
Results: 0 6 70 44 200 22 1 104 2 8 7 30 10 20 5 77 100 80 70 50 40 30 20 1 7 4 0 
correct! 
+0

這是太長,所以我不寫比較,如果有用告訴我,所以我補充 – hmmftg

+0

感謝您的回答真的很抱歉,我沒有把問題放在我已經擁有的代碼的其他部分,我已經有了插入和刪除操作,它只是在主要方法中,我不知道我怎麼能做到我想要的東西 – Jax

+0

@Jax看起來你在你的程序中有一個鏈接列表,你想用你的插入來填充它,然後將它的結果與所需的整數數組進行比較。我是對嗎? – hmmftg

0

你可以使用一個模塊化的方法:創建一個新的函數返回布爾值true是否「正確」和假的if else。將「預期列表」作爲參數傳遞給函數,並將編輯的列表聲明爲全局變量或將其作爲參數傳遞;我建議你也將它作爲參數傳遞給它。在函數體中,遍歷一個數組中的所有元素,並檢查是否存在某個特定元素,使用只在函數結束時返回true的嵌套循環,如果在另一個數組中找不到某個元素,則返回false。所以基本上原型如下:

bool check(int expected [],int list []);

希望有所幫助。

+0

感謝您的回答。你的解決方案看起來不錯,但如何做比較?檢查期望的數組是否對實際數組是否有效? – Jax

+0

@Jax bool找到; for(int i = 0; i hecate

+0

@Jax希望有幫助 – hecate

相關問題