很簡單啊,用一個數(shù)組,和2個指針就可以做到這一點,注意,一定要控制好指針,防止寫的東西覆蓋了沒有發(fā)送的東西。
成都創(chuàng)新互聯(lián)主營貢山網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,成都APP應用開發(fā),貢山h5微信小程序定制開發(fā)搭建,貢山網(wǎng)站營銷推廣歡迎貢山等地區(qū)企業(yè)咨詢
一個指針控制寫,一個控制輸出。如果走到尾巴 ,就把它移動到數(shù)組的0號元素。如果寫的郭快,趕上了輸出指針就不可以寫?;騽t進行互斥處理,方法太多。不過寫起來浪費時間。
//改正如下,但是我覺得你那個出隊有點問題,不應當是自己輸入要出隊的元素吧,是讓他自己出隊吧,然后把這個出隊的元素值帶回來,再在主函數(shù)中輸出吧,沒給你改,嘿嘿嘿嘿
#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 5
typedef struct k
{
int data[MAXSIZE];
int front,rear;
int num;
}c_k; //聲明循環(huán)順序隊列的數(shù)據(jù)類型
//創(chuàng)建循環(huán)隊列
c_k *create_k()
{
c_k * cq=(c_k *)malloc(sizeof(c_k)); //開辟循環(huán)隊列的空間,并將地址存到變量cq中
cq-front=-1;
cq-rear=-1;
cq-num=0;//初始化為空隊列
return cq;//返回隊列的地址
}
int In_ck(c_k * cq,int *x)//-----在傳的時候是個地址,所以這要用int *x-------///如果要用int x的話,在調(diào)用該函數(shù)時就要寫成In_ck(cq,rear_x)--//
{
if(cq-num==MAXSIZE)//隊列已滿
{
printf("The c_k is full!\n");return -1;
}
else//隊列不滿
{
cq-rear=(cq-rear+1)%MAXSIZE;//形成循環(huán)
cq-data[cq-rear]=*x;/////------傳的是地址,所以這要用*x----/////
cq-num++;//隊列中元素個數(shù)增1
return 1;
}
}
//出隊
int Out_ck(c_k * cq, int *x)//對cq所指向的隊列出隊,將隊首元素存到x所指向的變量,并返回是否出隊成功
{
if(cq-num==0)//隊列為空
{
printf("The k is null!\n");return -1;
}
else//隊列非空
{
cq-front=(cq-front+1)%MAXSIZE;//形成循環(huán)
*x=cq-data[cq-front];//將隊首元素存到x所指向的變量
cq-num--;//隊列中元素個數(shù)減1
return 1;
}
}
void main()
{
//調(diào)用創(chuàng)建隊列函數(shù)
c_k * cq=create_k();
int rear_x,front_x;
int op,result;
printf("\n請輸入 1入隊,2出隊,3退出:\n");
scanf("%d",op);
while(op!=3)
{
switch(op)
{
case 1:printf("請入入隊元素:\n");
scanf("%d",rear_x);////----這要加號,!!!!!
if((result=In_ck(cq,rear_x))==1)////----加了一個if語句,在隊空時就不輸出元素了-----////
printf("入對元素是 %d\n",rear_x);
break;
case 2:printf("請輸入出隊元素:\n");
scanf("%d",front_x);////----這要加號,!!!!!
if ((result= Out_ck(cq,front_x))==1)////----加了一個if語句,在隊空時就不輸出元素了-----////
printf("出對元素是 %d\n",front_x);
break;
}
printf("\n請輸入 1入隊 2出隊 3退出:\n");scanf("%d",op);
}
free(cq); /////---動態(tài)開辟的,用后要用free()釋放;---////
}
#includestdio.h
#includestdbool.h
#includemalloc.h
typedef
int
typedata;
struct
node
{
struct
node
*prev,
*next;
typedata
data;
};
typedef
struct
node
node;
typedef
struct
node*
link;
//
============init_head===============
//
//頭節(jié)點的初始化
link
init_head(void)
{
link
head
=
(link)malloc(sizeof(node));
if(head
!=
NULL)
{
head-prev
=
head-next
=
head;
}
return
head;
}
//
============newnode
================
//
//創(chuàng)建新節(jié)點
link
newnode(typedata
data)
{
link
new
=
(link)malloc(sizeof(node));
if(new
!=
NULL)
{
//前趨指針和后趨指針都指向自己
new-prev
=
new-next
=
new;
new-data
=
data;
}
return
new;
}
//
=================is_empty================
//
bool
is_empty(link
head)
{
//為空時,頭節(jié)點的前趨指針和后趨指針都指向head(頭節(jié)點)
if((head-next==head)
(head-prev==head))
return
true;
return
false;
}
//
================insert_tail
==================
//
void
insert_tail(link
head,
link
new)
{
if(is_empty(head))
{
//第一個節(jié)點插入
head-next
=
head-prev
=
new;
new-next
=
new-prev
=
head;
return
;
}
//除了第一個節(jié)點插入
new-prev
=
head-prev;
new-next
=
head;
new-prev-next
=
new;
new-next-prev
=
new;
}
//
================show
====================
//
void
show(link
head)
{
//為空時,直接返回
if(is_empty(head))
return
;
//遍歷整個鏈
link
tmp
=
head-next;
while(tmp
!=
head)
{
printf("%d\t",
tmp-data);
tmp
=
tmp-next;
}
printf("\n");
}
//
==============insert_opint
===============
//
void
insert_opint(link
end_node,
link
p)
{
p-prev
=
end_node;
p-next
=
end_node-next;
end_node-next-prev
=
p;
end_node-next
=
p;
}
//
================insertion_sort===========
//
//順序排序
void
insertion_sort(link
head)
{
if(is_empty(head))
return;
//把隊列分拆,頭節(jié)點和第一個節(jié)點為一個已排序的隊列,
//其他的節(jié)點逐個比較已排序隊列插
link
p
=
head-next-next;
head-prev-next
=
NULL;
head-next-next
=
head;
head-next-prev
=
head;
head-prev
=
head-next;
while(p
!=
NULL)
{
link
end_node
=
head-prev;
if(p-data
end_node-data)
{
link
tmp
=
p;
p
=
p-next;
insert_tail(head,
tmp);
}
else
{
while(end_node!=head
p-dataend_node-data)
end_node
=
end_node-prev;
link
tmp
=
p;
p
=
p-next;
insert_opint(end_node,
tmp);
}
}
}
int
main(void)
{
link
head
=
init_head();
if(head
==
NULL)
{
printf("falure\n");
return
0;
}
typedata
data;
while(1)
{
if(scanf("%d",
data)
!=
1
)
break;
link
new
=
newnode(data);
if(new
==
NULL)
{
printf("falure\n");
return
0;
}
insert_tail(head,
new);
show(head);
}
printf("the
figure
is:\n");
show(head);
insertion_sort(head);
show(head);
return
0;
}
a#include
"Stdio.h"
#include
stdlib.h
#include
"Conio.h"
#include
"malloc.h"
#define
TRUE
1
#define
FALSE
#define
INFEASIBLE
1
#define
OVERFLOW
-2
#define
OK
1
#define
ERROR
#define
MAXQSEZE
100
/*最大隊列長度*/
typedef
int
QElemType;
typedef
int
Status;
typedef
struct{
QElemType
*base;
/*初始化的動態(tài)分配存儲空間*/
int
front;
/*頭指針,若隊列不空,指向隊列頭元素*/
int
rear;
/*尾指針,若隊列不空,指向隊列尾元素的下一位置*/
}SqQueue;
Status
Queuelength(SqQueue
*Q){
/*構造一個空的循環(huán)隊列*/
Q-base=(QElemType
*)malloc(MAXQSEZE*sizeof(SqQueue));
if(!Q-base)
exit(OVERFLOW);
/*存儲分配失敗*/
Q-front=Q-rear=0;
return
OK;
}
Status
EnQueue(SqQueue
*Q,QElemType
e){
/*插入元素e為Q的新的隊尾元素*/
if((Q-rear+1)%MAXQSEZE==Q-front)
return
ERROR;/*隊列滿*/
Q-base[Q-rear]=e;
Q-rear=(Q-rear+1)%MAXQSEZE;
return
OK;
}
Status
DeQueue(SqQueue
*Q,QElemType
*e){
/*若隊列不空,則刪除Q的隊頭元素,用e返回其值*/
/*否則返回ERROR*/
if(Q-front==Q-rear)
return
ERROR;
*e=Q-base[Q-front];
Q-front=(Q-front+1)%MAXQSEZE;
return
OK;
}
Status
GetHead(SqQueue
*Q,QElemType
*e){
/*隊列不為空用e返回Q的頭元素,并返回OK,否則返回ERROR*/
if(Q-front==Q-rear)
return
ERROR;
*e=Q-base[Q-front];
return
OK;
}
Status
QueueEmpty(SqQueue
*Q){
/*隊列為空時返回OK否則返回FALSE*/
if(Q-front==Q-rear)
return
OK;
return
FALSE;
}
void
yanghuiTriangle(int
n){
/*打印輸出楊輝三角的錢n(n0)行*/
SqQueue
Q;
char
ch='
';
int
i,k;
QElemType
s,e;
FILE
*fq;
if((fq=fopen("output.txt","w"))==NULL){
/*打開寫入文件*/
printf("error
on
open\n");
exit
(1);
}
Queuelength(Q);
/*創(chuàng)建空的隊列*/
for(i=1;in;i++)
{
printf("
");
fputc(ch,fq);}
/*輸出n個空格以保持三角形的隊形*/
printf("1\n");
fprintf(fq,"%d\n",1);
EnQueue(Q,0);
/*添加第一行末尾的行分界0并入隊*/
EnQueue(Q,1);
/*第二行的兩個1值入隊列*/
EnQueue(Q,1);
k=2;
while(kn){
/*通過循環(huán)隊列輸出第2行到第n-1行的值*/
for(i=1;i=n-k;i++)
{printf("
");
fputc(ch,fq);}
/*輸出n-k個空格以保持三角形*/
EnQueue(Q,0);
do{
/*輸出第k行,計算第k+1行*/
DeQueue(Q,s);
GetHead(Q,e);
if(e)
/*若e為非行分界值0,則打印輸出e的值,并加一空格*/
{printf("%d
",e);
fprintf(fq,"%d%c",e,ch);
}
else
{
printf("\n");
fputc('\n',fq);}
/*回車換行,為下一行輸出做準備*/
EnQueue(Q,s+e);
/*計算所得抵k+1行的值入隊列*/
}while(e!=0);
k++;
}
DeQueue(Q,e);
/*行界值“0“出隊列*/
while(!QueueEmpty(Q)){
/*單獨處理第n行的值的輸出*/
DeQueue(Q,e);
{
printf("%d
",e);
fprintf(fq,"%d%c",e,ch);
}
}
}
int
main(void)
{
FILE
*
fp;
QElemType
n;
if((fp=fopen("input.txt","r"))==NULL){
/*打開寫入文件*/
printf("error
on
open\n");
exit
(1);
}
fscanf(fp,"%d",n);
/*讀入n*/
fclose(fp);
yanghuiTriangle(n);
getch();
return
0;
}
用一個文件輸入一個N,這個數(shù)位楊輝三角的行數(shù)上面是用循環(huán)隊列做的,你看看
對順序循環(huán)隊列,常規(guī)的設計方法是使用隊尾指針和隊頭指針,隊尾指針用于指出當前胡隊尾位置下標,隊頭指針用于指示當前隊頭位置下標?,F(xiàn)要求:
(1)設計一個使用隊頭指針和計數(shù)器胡順序循環(huán)循環(huán)隊列抽象數(shù)據(jù)類型,其中包括:初始化,入隊列,出隊列,取隊頭元素肯判斷隊列是否非空;
#include?"stdio.h"
#include?"malloc.h"
#include?"stdlib.h"
#include?"conio.h"
#define?MAX?80
typedef?struct
{
int?data[MAX];
int?front,rear;
int?num;
}SeQue;
SeQue?*Init_SeQue()
{
SeQue?*s;
s=new?SeQue;
s-front=s-rear=MAX-1;
s-num=0;
return?s;
}
int?Empty_SeQue(SeQue?*s)
{
if(s-num==0)
return?1;
else
return?0;
}
int?In_SeQue(SeQue?*s,int?x)
{
if(s-num==MAX)
return?0;
else
{?
s-rear=(s-rear+1)%MAX;
s-data[s-rear]=x;
s-num++;
return?1;
}?
}?
int?Out_SeQue(SeQue?*s,int?*x)
{
if(Empty_SeQue(s))
return?0;
else
{
s-front=(s-front+1)%MAX;
*x=s-data[s-front];
s-num--;
return?1;
}
}
void?Print_SeQue(SeQue?*s)
{
int?i,n;
i=(s-front+1)%MAX;
n=s-num;
while(n0)
{?printf("%d?",s-data[i]);
i=(i+1)%MAX;
n--;
}
}
void?main()
{
SeQue?*s;
int?k,flag,x;
s=Init_SeQue();
do{
printf("\\\");
printf("\\t\\t\\t循環(huán)順序隊列\(zhòng)");
printf("\\t\\t\\t***********************\");
printf("\\t\\t\\t**1-入隊**\");
printf("\\t\\t\\t**2-出隊**\");
printf("\\t\\t\\t**3-判?隊?空**\");
printf("\\t\\t\\t**4-隊列顯示**\");
printf("\\t\\t\\t**0-返回**\");
printf("\\t\\t\\t***********************\");
printf("\\t\\t\\t?請輸入菜單項(0-4):");
scanf("%d",k);
switch(k)
{
case?1:
printf("\請輸入入隊元素:");
scanf("%d",x);
flag=In_SeQue(s,x);
if(flag==0)
printf("\隊滿不能入隊!按任意鍵返回..");
else
printf("\元素已入隊!按任意鍵返回..");
getch();
system("cls");
break;
case?2:
flag=Out_SeQue(s,x);
if(flag==0)
printf("\隊列空出隊失敗!按任意鍵返回..");
else
printf("\隊列頭元素已出隊~!按任意鍵返回..");
getch();
system("cls");
break;
case?3:
flag=Empty_SeQue(s);
if(flag==1)
printf("\該隊列為空!按任意鍵返回..");
else
printf("\該隊列不為空!按任意鍵返回..");
getch();
system("cls");
break;
case?4:
printf("\該隊列元素為:");
Print_SeQue(s);
printf("\按任意鍵返回..");
getch();
system("cls");
break;
}
}while(k!=0);
}