Computer >> Máy Tính >  >> Lập trình >> lập trình C

In bản đảo ngược của Danh sách được Liên kết mà không có thêm dung lượng và sửa đổi trong Chương trình C.

Nhiệm vụ là in các nút bắt đầu từ cuối danh sách được liên kết mà không sử dụng thêm khoảng trắng, nghĩa là không được có thêm bất kỳ biến nào thay vào đó con trỏ tiêu đề trỏ đến nút đầu tiên sẽ được di chuyển.

Ví dụ

Input: 10 21 33 42 89
Output: 89 42 33 21 10

In bản đảo ngược của Danh sách được Liên kết mà không có thêm dung lượng và sửa đổi trong Chương trình C.

Có thể có nhiều giải pháp để in danh sách được liên kết theo thứ tự ngược lại, như cách tiếp cận đệ quy (sử dụng thêm không gian), đảo ngược danh sách được liên kết (yêu cầu sửa đổi trong Danh sách được liên kết đã cho), đẩy các phần tử lên một ngăn xếp rồi bật và hiển thị các phần tử từng cái một (yêu cầu khoảng trắng O (n)), nhưng những giải pháp này dường như sử dụng nhiều không gian hơn O (1).

Để đạt được kết quả mà không cần sử dụng nhiều hơn O (1), chúng tôi có thể -

  • Đếm số lượng nút trong danh sách được liên kết
  • Vòng lặp từ i =n đến 1 và in nút của vị trí thứ i.

Thuật toán

START
Step 1 -> create node variable of type structure
   Declare int data
   Declare pointer of type node using *next
Step 2 ->Declare function int get(struct node* head)
   Declare variable as int count=0
   Declare struct node *newme=head
   Loop While newme!=NULL
      Increment count by 1
      Set newme = newme->next
   End
   Return count
Step 3 -> Declare Function void push(node** headref, char newdata)
   Allocate memory using malloc
   Set newnode->data = newdata
   Set newnode->next = (*headref)
   Set (*headref) = newnode
Step 4 -> Declare function int getN(struct node* head, int n)
   Declare struct node* cur = head
   Loop for int i=0 and i<n-1 && cur != NULL and i++
   Set cur=cur->next
   End
Return cur->dataStep 5 -> Declare function void reverse(node *head)
   Declare int n = get(head)
   Loop For int i=n and i>=1 and i—
      Print getN(head,i)
   End
Step 6 ->In Main()
   Create list using node* head = NULL
   Insert elements through push(&head, 89)
   Call reverse(head)
STOP

Ví dụ

#include<stdio.h>
#include<stdlib.h>
//node structure
struct node {
   int data;
   struct node* next;
};
void push(struct node** headref, int newdata) {
   struct node* newnode = (struct node*) malloc(sizeof(struct node));
   newnode->data = newdata;
   newnode->next = (*headref);
   (*headref) = newnode;
}
int get(struct node* head) {
   int count = 0;
   struct node* newme = head;
   while (newme != NULL){
      count++;
      newme = newme->next;
   }
   return count;
}
int getN(struct node* head, int n) {
   struct node* cur = head;
   for (int i=0; i<n-1 && cur != NULL; i++)
      cur = cur->next;
   return cur->data;
}
void reverse(node *head) {
   int n = get(head);
   for (int i=n; i>=1; i--)
      printf("%d ", getN(head, i));
}
int main() {
   struct node* head = NULL; //create a first node
   push(&head, 89); //pushing element in the list
   push(&head, 42);
   push(&head, 33);
   push(&head, 21);
   push(&head, 10);
   reverse(head); //calling reverse function
   return 0;
}

Đầu ra

nếu chúng ta chạy chương trình trên thì nó sẽ tạo ra kết quả sau

89 42 33 21 10