Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

พิมพ์ย้อนกลับของ Linked List โดยไม่ต้องเว้นวรรคและแก้ไขในโปรแกรม C


งานคือการพิมพ์โหนดที่เริ่มต้นจากจุดสิ้นสุดของรายการที่เชื่อมโยงโดยไม่ต้องใช้ช่องว่างเพิ่มเติม ซึ่งหมายความว่าไม่ควรมีตัวแปรเพิ่มเติมใด ๆ แทนตัวชี้ส่วนหัวที่ชี้ไปยังโหนดแรกจะถูกย้าย

ตัวอย่าง

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

พิมพ์ย้อนกลับของ Linked List โดยไม่ต้องเว้นวรรคและแก้ไขในโปรแกรม C

มีวิธีแก้ไขมากมายในการพิมพ์รายการที่เชื่อมโยงในลำดับย้อนกลับ เช่น วิธีการแบบเรียกซ้ำ (ใช้ช่องว่างเพิ่มเติม) ย้อนกลับรายการที่เชื่อมโยง (ต้องแก้ไขในรายการที่เชื่อมโยงที่กำหนด) ผลักองค์ประกอบบนสแต็กแล้วป๊อปและแสดงองค์ประกอบ ทีละรายการ (ต้องการช่องว่าง O(n)) แต่ดูเหมือนว่าโซลูชันเหล่านี้ใช้พื้นที่มากกว่า O(1)

เพื่อให้บรรลุผลโดยไม่ต้องใช้มากกว่า O(1) เราสามารถ -

  • นับจำนวนโหนดในรายการที่เชื่อมโยง
  • วนจาก i =n ถึง 1 และพิมพ์โหนดของตำแหน่งที่ i

อัลกอริทึม

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

ตัวอย่าง

#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;
}

ผลลัพธ์

หากเรารันโปรแกรมด้านบน มันจะสร้างผลลัพธ์ดังต่อไปนี้

89 42 33 21 10