0

誰か助けてください。宿題で困っています。

この宿題はとても簡単です。list(1,2,3) を作成し、 function を作成して中間の番号を削除しますdelnode。ただし、関数を使用する必要がありますfree()

現在、(1,2,3)リンクリスト方式を使用してリストを作成しています。番号2を削除したいのですが、うまくいきません。で出てくるはずなのに(1,3)で出てくる(2,3)

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


struct node{
    int number;
    struct node* next;
};

typedef struct node node;

//prototype function
node* allocateMemory(void);
node* insertNode(node*);
void delnode(node*);

int main(){
    int i,num;
    node* entr = allocateMemory();
    node* p = NULL;

    entr->number = 1;
    entr->next = NULL;

    num = 3;

    for(i=1;i<num;i++){
        if(!p){
            p=insertNode(entr);
        }else{
            p=insertNode(p);
        }

        p->number = i+1;
    }

    while(entr){
        if(entr->number == 2){
            entr->number == NULL;
            break;
        }
        entr=entr->next;
    }

    while(entr){
        printf("%d\n",entr->number);
        entr=entr->next;
    }

    return 0;
}

node* insertNode(node* current){
    node* newNode = allocateMemory();
    current->next = newNode;
    newNode->next = NULL;
    return newNode;
}


void delnode(node* current){
    node* temp = allocateMemory();
    temp = current->next->next;
    free(current->next);
    current = temp;
    free(temp);
    return ;
}

node* allocateMemory(void){
    return (node*)malloc(sizeof(node));
}
4

2 に答える 2

4

いくつかの問題:

(1) 作成している元のリストは [2,3] であり、[1,2,3] ではありません - ループは i=1,i=2 に対して繰り返されます - そしてそれぞれに i+1 を挿入します - 結果として [ 2,3]
(2) あなたの削除は何もしていません:

while(entr){
   if(entr->number == 2){
       entr->number == NULL;
       break;
   }
   entr=entr->next;
}

entr->number == NULLこれはブール値の評価であり、割り当てではないことに 注意してください-使用するためoperator==

operator=(値に代入したくないため、同様に失敗することに注意してNULLください。実際にやりたいことは、前のノードnextフィールドを代入することです。)

PS
このデータ構造の用語はLinked Listであり、「Linear List」ではありません

于 2012-11-12T07:59:53.940 に答える
2

わかりました、この関数delnodeはあらゆる種類の混乱です。ノードを削除しようとしているときに、追加のメモリを割り当てる必要はありません。前を次にリンクし、現在を削除する必要があります。

| prev |      | current |      | next |
|------|      |---------|      |------|
   /\              X               /\
   ||              X               ||
   |================================|

これはもっとこのように見えるはずです。

void delnode(node* current)
{
  node* next = current->next;
  // Now we need to find the node previous to this.
  node* prev = entr; // From the start.
  while(prev->next != current) { prev = prev->next; };
  free(current); // delete the current node.
  prev->next = next; // Link the previous node to the next in the list.
}

3つのノードを追加しようとしている場合は、ループを変更する必要があります。

node* current = entr;
for(i=0;i<3;i++)
{
  int newCount = current->number++; // Increment count.
  current = insertNode(current); // Returns the new node.
  current->number = newCount; // Assign new count.
}

次のノードを削除するnumber場合2

node* idx = entr;
while(idx)
{
  if(idx->number == 2) { delnode(idx); break; } // Delete node and break.
  idx = idx->next; // Else, go to next node.
}
于 2012-11-12T08:03:10.763 に答える