C言語のリンクリストを使用してスタックを説明する
スタックオーバーフローとスタックアンダーフローは、メモリを動的に割り当てることで回避できます。
Cプログラミング言語でスタックの下で実行される操作は次のとおりです-
- プッシュ
- ポップ
プッシュ
以下は、リンクリストの基本的な実装です-
&item = 10 newnode = (node*) malloc (sizeof (node)); newnode ->data = item; newnode ->link = NULL; newnode ->link = start; start = newnode;
ポップ
構文は次のとおりです-
構文
if (start = = NULL)
printf("Deletion is not possible.List is empty")
else{
temp = start;
start = start link;
free (temp);
} プログラム
以下は、リンクリストを使用したスタック用のCプログラムです-
#include <stdio.h>
#include <stdlib.h>
struct node{
int info;
struct node *ptr;
}*top,*top1,*temp;
int topelement();
void push(int data);
void pop();
void empty();
void display();
void destroy();
void stack_count();
void create();
int count = 0;
void main(){
int no, ch, e;
printf("\n 1 - Push");
printf("\n 2 - Pop");
printf("\n 3 - Top");
printf("\n 4 - Empty");
printf("\n 5 - Exit");
printf("\n 6 - Display");
printf("\n 7 - Stack Count");
printf("\n 8 - Destroy stack");
create();
while (1){
printf("\n Enter choice : ");
scanf("%d", &ch);
switch (ch){
case 1:
printf("Enter element : ");
scanf("%d", &no);
push(no);
break;
case 2:
pop();
break;
case 3:
if (top == NULL)
printf("stack is empty");
else{
e = topelement();
printf("\n Top element : %d", e);
}
break;
case 4:
empty();
break;
case 5:
exit(0);
case 6:
display();
break;
case 7:
stack_count();
break;
case 8:
destroy();
break;
default :
printf(" wrong choice:Try again ");
break;
}
}
}
//empty stack
void create(){
top = NULL;
}
void stack_count(){
printf("\n no: of elements in stack : %d", count);
}
//push data
void push(int data){
if (top == NULL){
top =(struct node *)malloc(1*sizeof(struct node));
top->ptr = NULL;
top->info = data;
}
else{
temp =(struct node *)malloc(1*sizeof(struct node));
temp->ptr = top;
temp->info = data;
top = temp;
}
count++;
}
void display(){
top1 = top;
if (top1 == NULL){
printf("empty stack");
return;
}
while (top1 != NULL){
printf("%d ", top1->info);
top1 = top1->ptr;
}
}
void pop(){
top1 = top;
if (top1 == NULL){
printf("\n error");
return;
}
else
top1 = top1->ptr;
printf("\n Popped value : %d", top->info);
free(top);
top = top1;
count--;
}
int topelement(){
return(top->info);
}
//check stack empty or not
void empty(){
if (top == NULL)
printf("\n empty stack");
else
printf("\n stack not empty with %d values", count);
}
void destroy(){
top1 = top;
while (top1 != NULL){
top1 = top->ptr;
free(top);
top = top1;
top1 = top1->ptr;
}
free(top1);
top = NULL;
printf("\n all are destroyed");
count = 0;
} 出力
上記のプログラムを実行すると、次の結果が得られます-
1 - Push 2 - Pop 3 - Top 4 - Empty 5 - Exit 6 - Display 7 - Stack Count 8 - Destroy stack Enter choice: 1 Enter element: 23 Enter choice: 1 Enter element: 45 Enter choice: 1 Enter element: 56 Enter choice: 2 Popped value: 56 Enter choice: 6 45 23 Enter choice: 8 all are destroyed Enter choice: 6 empty stack Enter choice: 5
-
Cのリンクリストを使用した優先キュー
データと優先度は整数値として与えられ、タスクは与えられた優先度に従ってリンクリストを作成し、結果を表示することです。 キューはFIFOデータ構造であり、最初に挿入された要素が最初に削除されます。優先度付きキューは、優先度に応じて要素を挿入または削除できるキューの一種です。キュー、スタック、またはリンクリストのデータ構造を使用して実装できます。優先キューは、次のルールに従って実装されます- 優先度が最も高いデータまたは要素は、優先度が最も低いデータまたは要素の前に実行されます。 2つの要素の優先度が、順番に実行される要素と同じである場合、それらはリストに追加されます。 優先度付きキュー
-
リンクリストの代替ノードをC言語で印刷する(反復法)
この問題では、プログラムは、反復法を使用して、指定されたリンクリストから代替を印刷する必要があります。 反復法は、条件が値1またはtrueになるまで実行されるループを一般的に使用する方法です。 たとえば、リストにはノード29、34、43、56、88が含まれ、出力には29、43、88などの代替ノードが含まれます。 例 Input: 29->34->43->56->88 Output: 29 43 88 アプローチは、最後のノードまでリスト全体をトラバースすることです。一方、1にインクリメントされるカウンター変数をトラバースすることができ、ユーザーの選択に応じて