1

C の連結リストの最初と最後の要素を削除する方法がわかりません。以下は、リンクされたリストを使用する私のプログラムです。最後の要素を実際に削除する方法はわかりませんが、見つけることはできます。この要素は、整数と次のポインターで構成されます。誰かが私を助けてくれれば、それは大歓迎です。

struct ListNode{
    int value;
    struct ListNode *next;
};
typedef struct ListNode Link;

void deleteLast(Link *);
void printList(Link *);
void deleteFirst(Link *);

int main(){
    Link *myList;
 Link *curr, *newlink;
 int i;
    curr = myList;
    for(i = 0; i < 10; i++){

            newlink = (Link*) malloc(1*sizeof(Link));
            newlink->value = i*i;
            curr->next = newlink;
            curr = newlink;
    }

    curr->next = NULL;
    curr = myList->next;
    deleteFirst(curr);
    printList(curr);
    printf("\n");
}
void deleteLast(Link *head)
{
    Link *curr;
    curr = head->next;
    while (curr->next!=NULL)
    {
        curr = curr->next;
    }
     free(curr->next);

    curr->next = NULL;

}
void printList(Link *head){
    Link *curr;
    curr = head->next;

    printf("[");
    if(curr!=NULL){
        printf("%d",curr->value);
        curr = curr->next;
    }

    while(curr != NULL){
        printf(", %d", curr->value);
        curr = curr->next;
    }
    printf("]\n");

}
void deleteFirst(Link *head){
    Link *curr;
    curr = head->next;
    free(curr->value);
    free(curr->next);
    printf("%d\t",curr->value);
}

何を試してもうまくいきません。助けてください。

4

4 に答える 4

2

コードに多くのエラーがあります。

  • リストを作成するとき:
    • malloc の戻り値をキャストする必要はありません
    • curr->next = newlink;初期化された値で where curr = myList を実行しています。ループを次のように変更できます
  Link *myList = NULL;
  Link *curr, *newlink;
  int i;

  curr = myList;
  for(i = 0; i < 10; i++){

    newlink = malloc(1*sizeof(Link));
    newlink->value = i*i;
    if (curr != NULL)
      curr->next = newlink;
    else
      myList = newlink;
    curr = newlink;
  }
  • 遠くに行く最後の要素を削除すると、それが機能しない理由です
  Link  *curr;

  curr = head->next;   
  while (curr->next != NULL) {
    head = curr;
    curr = curr->next;
  }

  free(head->next);
  head->next = NULL;
  • リストの最初の要素を削除したい場合
    • malloc で割り当てていないため、フィールド値を解放する必要はありません。
    • リストの最初の要素を削除しても、メインのリストの先頭の値は変更されません。それがあなたがパラメータとして取る必要がある理由ですLink**
void deleteFirst(Link **head){
  Link *curr;

  curr = (*head)->next;
  free(*head);
  *head = curr;
}

また、リストの先頭のアドレスを指定することで、メインからこの関数を呼び出すことができます。

  deleteFirst(&myList);
  deleteLast(myList);
  printList(myList);

もちろん、すべての関数で、リストに少なくともいくつかの値があり、空のポインターではないかどうかを確認する必要がありますNULL

于 2013-07-28T12:14:24.877 に答える
0

このコードは、linklist の最後の要素を削除するために機能します。

void dellast()

{

r=head;

struct node* z;
do
{
    z=r;
    r=r->next;
    if(r->next==NULL)
    {
        z->next=NULL;
        free(r->next);
    }   
}while(z->next!=NULL);
}

コードは次のように機能します。

現在のノードとその前のノードを追跡します。

current->next==NULL の場合、それが最後のノードであることを意味します。

したがって、previous->next=NULL を実行し、現在のノードを解放します

于 2016-07-30T18:46:17.197 に答える