撰寫洗掉或增加鏈堆疊的任意節點,運行程式后,無論是先增加還是先洗掉,在第一個scanf輸入時,總要再輸入一個資料才能執行下一步,并且輸入的資料會覆寫下一個scanf輸入的資料
然后我是初學者,能不能順便幫忙看一下鏈堆疊的任意兩個節點交換的那部分的程式哪里出錯了
感謝前輩們

代碼如下:#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
//#define SIZE 100
typedef struct NODE //定義節點結構體型別
{
int data; //資料域
struct NODE *Next; //指標域
} NODE, *PNODE;
typedef struct Stack //定義鏈堆疊
{
PNODE top; //堆疊頂指標
PNODE base; //堆疊底指標
int stack_size; //堆疊的大小
}STACK,*PSTACK;
typedef struct stack //定義順序堆疊
{
int * top; //堆疊頂指標
int * base; //堆疊底指標
int SQ_size; //堆疊的大小
}stack,*pstack;
int init_stack(PSTACK p); //初始化
int Push_stack(PSTACK p,int push); //進堆疊
int full_stack(PSTACK p); //判斷堆疊是否已滿
int Pop_stack(PSTACK p); //出堆疊
int travel_stack(PSTACK p); //遍歷堆疊元素
int insert_stack(PSTACK p); //在任意節點后面輸入資料
int delete_stack(PSTACK p); //洗掉任意節點
int adjust_stack(PSTACK p,int i,int t); //調整任意兩節點資料域的位置
int length(PSTACK ps); //求堆疊元素的個數
int main()
{
int pop;
STACK link_stack;
init_stack(&link_stack); //堆疊的初始化
Push_stack(&link_stack,5); //插入資料
Push_stack(&link_stack,28);
Push_stack(&link_stack,45);
Push_stack(&link_stack,52);
Push_stack(&link_stack,11);
travel_stack(&link_stack);
printf("\n");
insert_stack(&link_stack); //在任意地點插入資料
travel_stack(&link_stack);
delete_stack(&link_stack);
travel_stack(&link_stack);
printf("\n");
//adjust_stack(&link_stack,2,3);
// printf("\n");
// travel_stack(&link_stack);
}
int init_stack(PSTACK p) //初始化
{
p->base=(PNODE)malloc(sizeof(NODE)); //申請空間創建一個頭節點,地址傳給p->base
if(p->base==NULL)
{
printf("申請堆疊失敗\n");
exit(-1);
}
else
{
p->base->Next=NULL;
p->top=p->base;
p->stack_size==NULL;
printf("堆疊初始化成功\n");
}
return 1; //表示初始化完成
}
int Push_stack(PSTACK p,int push)
{
PNODE p_new;
p_new=(PNODE)malloc(sizeof(NODE)); //申請空間創建節點
p_new->data=https://bbs.csdn.net/topics/push;
p_new->Next=p->top;
p->top=p_new;
p->stack_size++;
printf("%d進堆疊成功\n",p_new->data);
return ;
}
int Pop_stack(PSTACK p,int *pop) //出堆疊
{
if(empty_stack(&p)==1)
{
return 0; //堆疊表為空,無元素出堆疊
}
else
{
*pop=p->top->data;
p->top=p->top->Next;
p->stack_size--;
printf("%d出堆疊成功\n",*pop);
printf("目前堆疊表還剩%d個元素\n",p->top-p->base); //??????
}
return 1;
}
int travel_stack(PSTACK p) //遍歷鏈堆疊
{
if(empty_stack(&p)==1)
{
return 0; //堆疊表為空
}
else
{
PNODE q;
q=p->top;
while(q!=p->base)
{
printf("%d ",q->data);
q=q->Next;
}
}
}
int empty_stack(PSTACK p) //判斷堆疊是否為空
{
if(p->top-p->base==0)
{
printf("堆疊為空\n");
return 1; //表示堆疊空
}
else
{
return 0; //表示堆疊不為空
}
}
int full_stack(PSTACK p) //判斷堆疊是否已滿
{
if(p->top-p->base==p->stack_size)
{
printf("堆疊已滿\n");
return 1; //表示堆疊已滿
}
else
return 0; //表示堆疊未滿
}
int insert_stack(PSTACK p) //在任意位置插入資料
{
int i,val;
int temp;
PNODE q; //輔助節點
PNODE pnew;
printf("請輸入需要插入的位置和資料:");
scanf("%d,%d\n",&i,&val); //輸入需要插入的位置
q=p->top;
for(temp=0;temp<i-1;temp++) //尋找第i個位置
{
q=q->Next;
}
pnew=(PNODE)malloc(sizeof(NODE)); //申請空間給新節點
pnew->data=https://bbs.csdn.net/topics/val;
pnew->Next=q->Next;
q->Next=pnew;
return 1;
}
int delete_stack(PSTACK p) //洗掉任意節點
{
int i;
int t,del;
PNODE r;
PNODE q;
int len = length(&p); //求堆疊元素的個數
r=p->top;
printf("請輸入需要洗掉的節點:");
scanf("%d\n",&i);
if(i==1)
{
r=p->top;
del=r->data;
p->top=r->Next;
free(r);
printf("被洗掉的值為:%d\n",del);
}
if(i!=1)
{
for(t=0;t<i-2;t++)
{
r=r->Next;
}
q=r->Next;
del=q->data;
r->Next=q->Next;
free(q);
printf("被洗掉的值為:%d\n",del);
}
return 1; //表示洗掉成功
}
int adjust_stack(PSTACK p,int i,int t) //交換資料
{
PNODE q=p->top;
PNODE r=p->top;
//交換的位置
int j,k,temp; //交換位置的資料域的值
int len = length(&p); //求堆疊的元素個數
for(j=0;j<len-i;j++) //尋找第一個位置的地址
{
q=q->Next;
}
for(k=0;k<len-t;k++) //尋找第二個位置的地址
{
r=r->Next;
}
temp=q->data;
q->data=https://bbs.csdn.net/topics/r->data;
r->data=https://bbs.csdn.net/topics/temp;
return 1; //調整完成
}
int length(PSTACK ps) //求堆疊元素的個數
{
PNODE q=ps->top;
int len=0;
q=ps->top;
while(q!=NULL)
{
len++;
q=q->Next;
}
return len;
}
鏈堆疊任意節點的資料域的值交換程式:
int adjust_stack(PSTACK p,int i,int t) //交換資料
{
PNODE q=p->top;
PNODE r=p->top;
//交換的位置
int j,k,temp; //交換位置的資料域的值
int len = length(&p); //求堆疊的元素個數
for(j=0;j<len-i;j++) //尋找第一個位置的地址
{
q=q->Next;
}
for(k=0;k<len-t;k++) //尋找第二個位置的地址
{
r=r->Next;
}
temp=q->data;
q->data=https://bbs.csdn.net/topics/r->data;
r->data=https://bbs.csdn.net/topics/temp;
return 1; //調整完成
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/189719.html
標籤:C語言
上一篇:阿里Java校招,剛畢業就拿到offer,真是太強了。
下一篇:c++中的建構式
