簡體   English   中英

無法從c中的循環鏈表中刪除第一個元素

[英]Unable to delete first element from circular linked list in c

假設列表中有 3 個元素 (10 20 30)。 現在在第一個刪除元素時刪除 10 個。現在只剩下 20 和 30 個了。 同樣,如果我刪除第一個元素,那么 20 將從列表中刪除。 但是現在如果我嘗試從列表中刪除單獨的元素,即 30,它不會發生。

提前致謝。

#include <stdio.h>
#include <stdlib.h>
typedef struct node {
  int data;
  struct node *next;
} list;
list *start = NULL;
list *create(list *);
list *display(list *);
list *delete_beg(list *);
int main() {
  int n;

  printf("1: Create list\n");
  printf("2: Display\n");
  printf("3: Delete first element\n");
  for (;;) {
    printf("Enter your choice: ");
    scanf("%d", &n);

    switch (n) {
    case 1:
      start = create(start);
      printf("\nList created successfully\n");
      break;
    case 2:
      start = display(start);
      break;
    case 3:
      start = delete_beg(start);
      break;
    default:
      printf("Wrong input!!!");
      exit(0);
    }
  }
}
list *create(list *start) {
  list *new_node, *ptr;
  int num;
  printf("Enter data: ");
  scanf("%d", &num);
  new_node = (list *)malloc(sizeof(list));
  new_node->data = num;
  if (start == NULL) {
    start = new_node;
    new_node->next = start;
  } else {
    ptr = start;
    while (ptr->next != start) {
      ptr = ptr->next;
    }
    ptr->next = new_node;
    new_node->next = start;
  }
  return start;
}
list *display(list *start) {
  list *ptr;
  if (start == NULL) {
    printf("Empty list");
    return start;
  } else {
    ptr = start;
    while (ptr->next != start) {
      printf("%d\n", ptr->data);
      ptr = ptr->next;
    }
    printf("%d\n", ptr->data);
  }
  return start;
}
list *delete_beg(list *start) {
  list *ptr;
  if (start == NULL) {
    printf("Empty list!!!");
    return start;
  } else {
    ptr = start;
    while (ptr->next != start)
      ptr = ptr->next;
    ptr->next = start->next;
    free(start);
    start = ptr->next;
    return start;
  }
}

在函數delete_beg ,當列表只包含一個將被刪除的節點時,指針 start 永遠不會設置為 NULL。

該函數可以通過以下方式定義

list *delete_beg(list *start) {
  if (start == NULL) {
    printf("Empty list!!!");
    return start;
  } else {
    List *current = start;
    List *ptr = start;

    while (ptr->next != start)
      ptr = ptr->next;

    if ( ptr->next == ptr ) 
    {
        start = NULL;
    }
    else 
    {
       start = start->next;
       ptr->next = start;
    }

    free( current );

    return start;
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM