2016-12-10 10 views
-1

リストを削除するときに問題があります(メモリを解放してください)。 シークエンスの場合、コードはリストのショートカットです。 シーケンス=同じ番号、それから3つの数字は等しい。 と私はシーケンスにc:無料機能

例見つけた後、新しい長さを返します。

Before: 3,3,3,3,2 
After: -4,3,2 
New length : 3 

を私が書くコードは、良い結果を与えるが、私はDelete_List機能プログラムがクラッシュを使用する場合。

node *Find_Sequence(node *L) { 
    node *headSeq = NULL, *tailSeq = NULL, *currL = L; 
    int flag = 0, cnt = 3; 
    while (currL != NULL) { 
     if (currL->next != NULL && currL->data == currL->next->data) { 
      if (currL->next->data == currL->next->next->data) { 
       flag = 1; // if flag = 1 it means that have a sequence, 
          // sequence: same number up and equal to 3. 
       headSeq = currL; 
       tailSeq = currL->next->next; 
       break; 
      } 
     } 
     currL = currL->next; 
    } 

    while (tailSeq != NULL) { // to find if hace more then 3 in the sequence and to know how many nodes to delete 
     if (tailSeq->next != NULL && tailSeq->data == tailSeq->next->data) 
      cnt++; 
     else { 
      //tailSeq->next = NULL; 
      break; 
     } 
     tailSeq = tailSeq->next; 
    } 

    if (headSeq != NULL) { 
     headSeq = Delete_Node(headSeq, tailSeq, cnt - 2); // cnt-2 because i want to stay a place for the head(-k) and for the tail (x) 
     headSeq->data = -1 * cnt; 
     if (headSeq != NULL) 
      headSeq = tailSeq; 
    } 
    return L; 
} 

node *Delete_Node(node *head, node *tail, int length) { 
    node *h = head, *t = tail, *curr = head, *temp = NULL; 
    int i; 

    for (i = 0; i < length; i++) { 
     temp = h; 
     h = h->next; 
     free(temp); 
    } 

    if (head != NULL) 
     head->next = tail; 

    return head; 
} 

int new_length(node *L) { 
    node *new_list = Find_Sequence(L); 
    int counter = 0; 
    while (new_list != NULL) { 
     counter++; 
     new_list = new_list->next; 
    } 
    return counter; 
} 

node *Delete_List(node *L) { 
    node *next; 
    while (L != NULL) { 
     next = L; 
     L = L->next; 
     free(next); 
    } 
    return L; 
} 

int main() { 
    node *list1 = NULLL; // empty lists 
    int len; 

    list1 = Creat_List(list1, 3); 
    list1 = Creat_List(list1, 3); 
    list1 = Creat_List(list1, 3); 
    list1 = Creat_List(list1, 5); 
    list1 = Creat_List(list1, 4); 

    printf("Before:"); 
    Print_List(list1); 
    len = new_length(list1); 
    printf("The new length is: %d\n", len); 
    printf("After:"); 
    Print_List(list1); 
    printf("\n"); 

    Delete_List(list1); 
} 
+1

"私は問題を抱えています"。その問題が何であるか正確に教えてください。プログラムはクラッシュしますか?正しい結果が得られないのでしょうか? – kaylum

+0

プログラムがクラッシュし、良い結果が得られます@kaylum – edenv3

+0

デバッガを使用します。ここで助けが必要な場合は[mcve]を提供してください。つまり、コードを問題を再現するのに必要な最小限の線に減らします。あなたはそれを行う過程で自分自身で問題を見つけるかもしれません。 – kaylum

答えて

0

問題headとして既にfree「Dのノード(1)

Delete_Nodeリターン。
たとえば、最初の要素を次のように変更します。

node *Delete_Node(node * head, node * tail , int length){ 
    node *h = head->next, *temp; 
    int i; 

    for (i = 0; h && i < length; i++){ 
     temp = h; 
     h = h->next; 
     free(temp); 
    } 

    head->next = tail; 

    return head; 
} 

問題は(2)Find_Sequenceif (currL->next->data == currL->next->next->data)
currL->next->next

は、それがNULLないことを保証するものではありません。
また、最初に見つかったリストだけが処理されます。
これは次のように簡略化されて書かれています。

はこれを試してみてください。

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

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

node *Creat_List(node *L, int value){ 
    node *current = L , *new_node = malloc(sizeof(node)); 
    new_node->data = value; 
    new_node->next = NULL; 

    if (L == NULL) { 
     L = new_node; 
    } else { 
     while (current->next != NULL) 
      current = current->next; 
     current = current->next = new_node; 
    } 
    return L; 
} 

node *Delete_Node(node *head, node *end){ 
    //top node not delete 
    node *curr = head->next; 

    while(curr != end){ 
     node *temp = curr; 
     curr = curr->next; 
     free(temp); 
    } 
    head->next = end; 

    return head; 
} 

int sameLength(node *L, node **next){ 
    node *curr = L; 
    int count = 0; 
    while(curr && curr->data == L->data){ 
     ++count; 
     curr = curr->next; 
    } 
    *next = curr; 
    return count; 
} 

node *Find_Sequence(node *L){ 
    node *curr = L, *next = NULL; 
    int cnt; 

    while (curr){ 
     cnt = sameLength(curr, &next); 
     if(cnt > 2){ 
      Delete_Node(curr->next, next);//Leave curr->next 
      curr->data = -cnt; 
     } 
     curr = next; 
    } 

    return L; 
} 

int new_length(node *L){ 
    node *new_list = Find_Sequence(L); 
    int counter = 0; 
    while (new_list){ 
     counter++; 
     new_list = new_list->next; 
    } 

    return counter; 
} 

node *Delete_List(node * L){ 
    node *temp; 
    while (L != NULL){ 
     temp = L; 
     L = L->next; 
     free(temp); 
    } 

    return NULL; 
} 

void Print_List(node * head){ 
    while (head != NULL){ 
     printf("%4d", head->data); 
     head = head->next; 
    } 
} 

int main(void){ 
    node *list1=NULL, *list2=NULL , *list3=NULL; 
    int len; 
    list1 = Creat_List(list1, 3); 
    list1 = Creat_List(list1, 3); 
    list1 = Creat_List(list1, 3); 
    list1 = Creat_List(list1, 5); 
    list1 = Creat_List(list1, 4); 

    printf("Before:"); 
    Print_List(list1); 
    len = new_length(list1); 
    printf("\nThe new length is: %d\n", len); 
    printf("After:"); 
    Print_List(list1); 
    printf("\n"); 
    Delete_List(list1); 

    list2 = Creat_List(list2, 2); 
    list2 = Creat_List(list2, 3); 
    list2 = Creat_List(list2, 3); 
    list2 = Creat_List(list2, 3); 
    list2 = Creat_List(list2, 3); 
    list2 = Creat_List(list2, 4); 

    printf("Before:"); 
    Print_List(list2); 
    len = new_length(list2); 
    printf("\nThe new length is: %d\n", len); 
    printf("After:"); 
    Print_List(list2); 
    printf("\n"); 

    list3 = Creat_List(list3, 3); 
    list3 = Creat_List(list3, 3); 
    list3 = Creat_List(list3, 5); 
    list3 = Creat_List(list3, 5); 
    list3 = Creat_List(list3, 5); 
    list3 = Creat_List(list3, 5); 
    list3 = Creat_List(list3, 5); 

    printf("Before:"); 
    Print_List(list3); 
    len = new_length(list3); 
    printf("\nThe new length is: %d\n", len); 
    printf("After:"); 
    Print_List(list3); 
    printf("\n"); 
} 
+0

[DEMO](http:// ideone。com/Xs5jdA) – BLUEPIXY

+0

本当にありがとう! @BLUEPIXY – edenv3

-1

リンクリストを解放するためには、次のようになります。

node * next; 
while (L != NULL) 
{ 
    next = L->next; 
    free(L); 
    L = next; 
} 

あなたは(whileループで)あなたのDelete_nodeまたはDelete_List関数で次のコード行を実行して実際には:

next = L; 
L = L->next; 
free(next); 

あなたは実際にLを次に指しているLを指している次を解放しています - >次に、あなたのリストの頭を決して解放することはありません。

関連する問題