2017-02-06 2 views
-9
#include<iostream> 
using namespace std; 


struct Node{ 
    int x; 
    Node *next; 
}; 

typedef struct Node * PtrToNode; 
typedef PtrToNode List; 
typedef PtrToNode Position; 
void Print(List L) 
{ 
    Position P = L; 
    while (P != NULL) 
    { 
     cout << P->x << " "; 
     P = P->next; 
    } 

} 


List InsertBeg(List L, int x){ 
    Node *tmp = new Node; 
    tmp->x = x; 
    if (L == NULL) 
    { 
     tmp->next = NULL; 
     L = tmp; 
    } 
    else 
    { 
     tmp->next = L; 
     L = tmp; 
    } 
    return L; 
} 

Position FindLast(List L){ 
    Position P = L; 
    if (L != NULL) 
    while (P->next != NULL) 
     P = P->next; 
    return P; 
} 


List deleteFirst(List L) { 
    Position P = L; 
    L = L->next; 
    P->next = NULL; 
    delete P; 
    return L; 
} 
Position FindX(List L, int x){ 
    Position P = L; 
    while (P != NULL && P->x != x){ 
     P = P->next; 
    } 
    return P; 
} 

Position FindPrevPos(List L, Position P){ 
    Position prev = L; 
    if (L != NULL) 
    if (P != NULL && (P != L)) 
    while (prev->next != P) 
     prev = prev->next; 
    return prev; 
} 
List deleteLast(List L) { 
    Position last = FindLast(L); 
    Position prev = FindPrevPos(L, last); 
    prev->next = NULL; 
    delete last; 
    return L; 
} 






List deleteX(List L, int x) 
{ 
    Position P = FindX(L, x); 
    if (P == L) 
     L = deleteFirst(L); 
    else if (P->next == NULL) 
     L = deleteLast(L); 
    else { 
     Position prev; 
     prev = FindPrevPos(L, P); 
     prev->next = P->next; 
     P->next = NULL; 
     delete P; 
    } 
    return L; 
} 
List deleteeven(List L){ 
    Position P = L; 
    while (P != NULL) 
    { 
     if (P->x % 2 == 0) 
      P = deleteX(L, P->x); 
     P = P->next; 
    } 
    return L; 
} 





int main() 
{ 
    List L = NULL; 
    L = InsertBeg(L, 4); 
    L = InsertBeg(L, 8); 
    L = InsertBeg(L, 1); 
    L = InsertBeg(L, 21); 
    Print(L); 

    L = deleteeven(L); 
    cout << "After deleting the even numbers"; 
    Print(L); 

    cin.get(); 
    cin.get(); 
    return 0; 
} 

私はevensではないオッズを削除する必要がありますが、私はこれをevensに対して持っていますが、修正してオッズを削除する必要があります私はオッズを削除するためにそれを変更することはできません!あなたがこれを修正して、オッズを削除する代わりに、それをたくさんいただければ幸いです。特定のリンクリストで奇数の要素を削除するコードを書く

ありがとうございます! STDを使用して

+4

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+0

ようこそスタックオーバーフロー。 [The Tour](http://stackoverflow.com/tour)を読み、[ヘルプセンター](http://stackoverflow.com/help/asking)の資料を参考にしてください。ここに聞いてください。 –

+3

誰かがIOストリームでCを教えているようです。このパスをあまりにも遠くに先行させる前に、[良い本を手に入れる](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)とCとC++の違いを学んでください。 – user4581301

答えて

0

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

List RemoveOdd(List L) { 

    Position* prev = &L; 
    Position cur = L; 
    while (cur) { 
     if (cur->x % 2) { 
      *prev = cur->next; 
      delete cur; 
      cur = *prev; 
     } else { 
      prev = &cur->next; 
      cur = cur->next; 
     } 
    } 

    return L; 

} 
+0

から**!**を削除すると申し訳ありません。今質問はより明確です。私はリンクリストから奇数の値を削除する必要があります – gtcodes

+0

編集されました。 'if'ブロックと' else'ブロックを切り替えるだけです。 –

+0

私は今、コードを別のものに置き換えました。これはevensを削除して動作します。これを修正してオッズを削除することはできますか?今は2時間試していてオッズのために働いていないので、私はオッズを削除する必要があります。 – gtcodes

1

::リストは良い解決策である、あなたはこのようにあなたの番号を定義することができます。

list<int> numbers; 

とのコード行でさえ、番号を削除:

numbers.remove_if([](int value) { return !(value % 2); }); 
+0

申し訳ありませんが、質問を正しく投稿して、編集しました。そのリンクリストの奇数値を削除する必要があります – gtcodes

+0

**!(値%2)** –

関連する問題