Ⅰ 如何用C語言創建一個鏈棧,並進行操作
1 思路: 主要是鏈表的插入和刪除操作
2 代碼
#include<stdio.h>
#include<stdlib.h>
typedefstructnode
{
intdata;
structnode*next;
}node_type;
voidpush(node_type*&stack,intelem){
node_type*node=(node_type*)malloc(sizeof(node_type));
node->data=elem;
node->next=stack;
stack=node;
}
intpop(node_type*&stack){
intelem=stack->data;
node_type*node=stack;
stack=stack->next;
free(node);
returnelem;
}
boolIsEmpty(node_type*stack){
returnstack==NULL;
}
voiddisplay(node_type*stack){
while(stack){
printf("%d",stack->data);
stack=stack->next;
}
puts("");
}
voiddestroy(node_type*stack){
while(!IsEmpty(stack)){
pop(stack);
}
}
intmain(){
puts("(1)建立空鏈棧");
node_type*stack=NULL;
puts(" (2)調用進棧函數,將從鍵盤輸入的數據元素逐個進棧,輸入0結束;");
intnum;
scanf("%d",&num);
while(num!=0){
push(stack,num);
scanf("%d",&num);
}
puts(" (3)顯示進棧後的數據元素");
display(stack);
puts(" (4)調用兩次出棧函數,顯示出棧後的數據元素");
if(!IsEmpty(stack))
printf("%d ",pop(stack));
if(!IsEmpty(stack))
printf("%d ",pop(stack));
destroy(stack);
getchar();
getchar();
return0;
}
3 運行效果
Ⅱ 關於鏈棧的實現問題
InitStack(S);
調用它並不能改變main()函數中的變數S的指向,從 InitStack(S);返回之後,S還是指向main()函數中定義時指向的值。如果希望調用 InitStack(S);就需要對 InitStack();做出修改:
void InitStack(LinkStack *S)
{
*S=(LinkStack)malloc(sizeof(SNode));
(*S)->next=NULL;
}
並且把main()函數中的
InitStack(S);
改為
InitStack(&S);
Ⅲ 順序棧與鏈式棧的區別
順序棧的實現在於使用了數組這個基本數據結構,數組中的元素在內存中的存儲位置是連續的,且編譯器要求我們在編譯期就要確定數組的大小,這樣對內存的使用效率並不高。
一來無法避免因數組空間用光而引起的溢出問題,二在系統將內存分配給數組後,則這些內存對於其他任務就不可用;
而對於鏈棧而言,使用了鏈表來實現棧,鏈表中的元素存儲在不連續的地址,由於是動態申請內存,所以我們可以以非常小的內存空間開始,另外當某個項不使用時也可將內存返還給系統。
Ⅳ C語言:鏈棧的基本操作(代碼如下:幫我看看錯哪了)
#include<stdio.h>
#include<stdlib.h>
typedefstructStackNode
{
intdata;
structStackNode*next;
}SNode;
//只進棧一個元素
voidPush(SNode*s,inte)
{
SNode*p;
p=(SNode*)malloc(sizeof(SNode));
s->data=e;
p->next=s;
s=p;
//returns;
}
//連續進棧n個元素
voidPush_Series(SNode*s)
{
printf("請輸入進棧的元素數:");
intn,i,e;
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("請輸入第%2.d個進棧元素:",i+1);
scanf("%d",&e);
Push(s,e);
//printf("此階段的元素為:%2.d
",s->next->data);
}
}
voidPop(SNode*s)
{
if(s==NULL)
{
printf("棧空了!!!");
exit(0);
}
SNode*q;
inte;
e=s->data;
printf("*****************
");
printf("棧頂元素為:%d",e);
printf("*****************
");
q=s;
s=s->next;
free(q);
}
//★:s是形參,你在裡面申請的內存空間地址是無法賦值給調用此函數的s的!
voidInirStack(SNode**s) //★:∴應用指針的指針!(或者C++里用引用)
{
*s=(SNode*)malloc(sizeof(SNode));
(*s)->next=NULL;
}
intmain()
{
SNode*s; //★你這個s沒有申請內存空間!
/*
SNode*s=(SNode*)malloc(sizeof(SNode));
s->next=NULL;*/
InirStack(&s); //★此處要把指針的指針代入
Push_Series(s);
Pop(s);
printf("Helloworld!
");
return0;
}
Ⅳ 鏈式棧。程序編譯通過,但一運行就死。貌似init函數那裡有問題,但是不知原因何在,求高手解救!
不多說了:
測試結果:
56 84 23 67 34 45
請按任意鍵繼續. . .
錯誤修改:
PSTACK S=(PSTACK)malloc(sizeof(STACK)); //只有給S申請一個合法的地址,才能把它作為參數去傳遞給init函數,應為init函數要對S指向的地址進行賦值操作。 【原來的S是游離指針】
init(S);
好運!
Ⅵ 編程實現鏈棧的入棧和出棧操作。 在線等著你哦!
#include<stdio.h>
#include<stdlib.h>
typedefstructSnode
{
intdata;/*數據域*/
structSnode*next;/*指針域*/
}SNODE,*LinkStack;/*其中SNODE為鏈棧中的結點類型名,LinkStack為指向結點的指針類型名*/
//////////////////
LinkStackPush(LinkStacktop,inte)
/*將數據元素e壓入到鏈棧top中,使其成為新的棧項元素*/
{
LinkStackp;
p=(LinkStack)malloc(sizeof(SNODE));/*生成一個新的結點*/
if(!p)/*如果分配空間失敗,則函數返回"OVERFLOW"*/
printf("StackisOverflow ");
p->data=e;/*新結點的數據域賦值*/
p->next=top;/*修改鏈使新結點插入到鏈表的頭部,並成為新的棧頂元素*/
top=p;
returntop;
}
/////////////
LinkStackPop(LinkStacktop,int*e)
/*將鏈棧top中的棧頂元素從棧中刪除,並用e返回其值*/
{
LinkStackq;
if(!top)/*如果棧空,則函數返回ERROR*/
printf("StackisERROR ");
*e=top->data;/*將被刪的棧頂元素的值保存在e中*/
q=top;/*用q記下待刪的棧頂元素*/
top=q->next;
/*修改鏈使待刪結點從鏈中"卸下",此時被刪結點的後繼成為新的棧頂元素結點*/
free(q);/*釋放被刪結點的存儲空間*/
returntop;
}
/////////
LinkStackStack_display(LinkStacktop)
{
inte;
while(top)
{
e=top->data;
printf("%4d",e);
top=top->next;
}
returntop;
}
/////////////////////
voidmain()
{
LinkStacktop=0;
inti=0,n,e;
printf("pleaseinputthelength:");/*輸入幾個數*/
scanf("%d",&n);
printf("pleaseinputtheValue: ");/*輸入*/
while(i<n)
{
scanf("%d",&e);
top=Push(top,e);
i++;
}
printf("thestackis: ");
Stack_display(top);
printf("pleaseinputtheinsertnode:");
scanf("%d",&e);
top=Push(top,e);
printf("thestackafterpushis: ");
Stack_display(top);
top=Pop(top,&e);
printf("thepopvalueis:%d ",e);
printf("thestackafterpopis: ");
Stack_display(top);
}
調好了麻煩採納一下