-2

リンクされたリスト(したがってポインター)を使用して、cでセットのリストを出力する必要があります。ただし、リストの最初の要素を削除してリストを印刷しようとすると、互いに多くのアドレスが表示されます。問題が何であるかについての提案はありますか?ありがとう!

削除機能:

 int delete(set_element* src, int elem){
 if (src==NULL) {
    fputs("The list is empty.\n", stderr);
 }


 set_element* currElement;
 set_element* prevElement=NULL;

 for (currElement=src; currElement!=NULL; prevElement=currElement, currElement=currElement->next)     {
    if(currElement->value==elem) {
        if(prevElement==NULL){
            printf("Head is deleted\n");
            if(currElement->next!=NULL){
                *src = *currElement->next;
            } else {

                destroy(currElement);
            }
        } else {
            prevElement->next = currElement->next;
        }
        //  free(currElement);
        break;
    }
   }



return 1;
}



 void print(set_element* start)
{
    set_element *pt = start;

    while(pt != NULL)
    {
      printf("%d, ",pt->value);
     pt = pt->next;
   }
 }
4

3 に答える 3

0

リスト ポインターが最初の要素へのポインターと同じである場合、リスト ポインターは、最初の要素のときに有効ではなくなりますfree

この問題には 2 つの解決策があります。

  1. 必要に応じてリストを更新できるように、すべてのリスト メソッドがリストへのポインタを取得できるようにします。このアプローチの問題は、別の変数にポインターのコピーがある場合、そのポインターも無効になることです。

  2. リスト ポインターが最初の要素を指さないようにしてください。最初の要素へのポインターを指すようにします。

サンプルコード:'

typedef struct node_struct {
  node_struct *next;
  void *data;
} Node;


typedef struct {
  Node *first;
} List;
于 2013-10-21T10:39:20.403 に答える
0

警告:この回答には推測されたコードが含まれています。

C での典型的な連結リストは、次のようになります。

typedef struct _list List;
typedef struct _list_node ListNode;

struct _list {
  ListNode *head;
}

struct _list_node {
  void *payload;
  ListNode *next;
}

リストから最初の要素を正しく削除するには、次の手順を実行する必要があります。

List *aList; // contains a list

if (aList->head)
  ListNode *newHead = aList->head->next;

delete_payload(aList->head->payload); // Depending on what the payload actually is
free(aList->head);
aList->head = newHead;

ここでの操作の順序は重要です。最初に古い値を解放せずにヘッドを移動しようとすると、メモリ リークが発生します。また、最初に新しいヘッドの正しい値を取得せずに古いヘッドを解放すると、未定義の動作が発生します。

補遺:場合によって_listは、上記のコードの一部が完全に省略され、リストとリスト ノードが同じものとして残されます。しかし、あなたが説明している症状から、これはおそらくここでは当てはまらないと思います.

ただし、このような状況では、手順は本質的に同じままですが、aList->ビットはありません。


編集:

コードを確認したので、より完全な回答を提供できます。

コードの主な問題の 1 つは、コードがいたるところにあることです。ただし、ここには特に悪い行が 1 つあります。

*src = *currElement->next;

これは機能せず、クラッシュの原因です。

あなたの場合、解決策は、上記の struct _list コンストラクトのように、リンクされたリストを何らかの方法でコンテナーにラップすることです。または、既存のコードを作り直して、セット要素へのポインターへのポインターを受け入れ、セット要素へのポインターを渡すことができるようにします (これがやりたいことです)。

パフォーマンスの点では、2 つのソリューションはほぼ同じである可能性が高いため、オッズはありませんが、ラッピング リスト構造を使用すると、意図を伝えるのに役立ちます。また、ヘッドの削除の結果として、リストへの他のポインターが文字化けするのを防ぐのにも役立ちます。

于 2013-10-21T10:37:22.690 に答える
0

これは通常、自分のものではないポインタ (実際にはメモリの一部) を削除したときに発生します。関数を再確認して、既に解放したのと同じポインターを解放していないこと、または「malloc」で作成していないポインターを解放していないことを確認してください。

于 2013-10-21T10:38:02.863 に答える