杨辉三角队列c语言程序,C语言完整队列 与链式队列实现杨辉三角
貴州商專///
編譯環境VS2010
#include "stdafx.h"
#include "stdlib.h"
#define M 100
int max;
typedef struct node
{
int S_J;
struct node *next;
struct node *tou;
struct node *wei;
}list; ?//隊列結構
void chushihua(list *l) ?//初始化
{
l->wei=(list *)malloc(sizeof(list));
if(l->wei==NULL) exit(0);
l->tou=l->wei;
}
int pankong(list *l) ?//判空
{
if(l->tou->next==NULL)
{
printf("隊列為空!請插入元素!\n");
return 1;
}
return 0;
}
void rudui(list *l,int w) ?//入隊
{
list *p=(list *)malloc(sizeof(list));
if(p==NULL) exit(0);
p->S_J=w;
p->next=NULL;
l->wei->next=p;
l->wei=p;
}
void duitou(list *l) ?//取隊頭元素
{
if(pankong(l))
{
return ;
}
printf("出隊元素為:%d\n",l->tou->next->S_J);
l->tou->next=l->tou->next->next;
if(l->tou->next==NULL)
//當隊列為空的時候,從新初始化,否則不能插入元素
l->wei=l->tou;
}
void chadui(list *l) ?//查看隊列
{
list *p=l->tou->next;
//定義臨時變量,防止破壞原隊列
while(p)
{
printf("%d->",p->S_J);
p=p->next;
}
printf("END\n");
}
void yanhui(int w)
{
//數組:
M=w;
int a[M][M],i,j;
for(i=0;i
{
for(j=M;j>=i;j--)
printf(" ?");
for(j=0;j<=i;j++)
{
if(i==j||j==0)
a[i][j]=1;
else
a[i][j]=a[i-1][j]+a[i-1][j-1];
printf("= ",a[i][j]);
if(i==j)
printf("\n");
}*/
///*上面采用的是數組的方法輸出楊輝三角!較為簡單,所以就不注釋了!下面將采用隊列的方法來實現楊輝三角!
// 相比前一種方法更節省內存空間,但同時也復雜很多!(沒辦法!老師要求用隊列啊!)
//鏈表隊列:
int i;int j;int k;int y=1;int n=0,t=0; ?//都是控制流程的變量,沒有必要糾結于此!
list *p=(list *)malloc(sizeof(list));
list *l=(list *)malloc(sizeof(list));
list *f=(list *)malloc(sizeof(list)); ?//p、l為中間鏈表;f是我們所要的鏈表!
chushihua(p);
chushihua(l);
chushihua(f); ?//初始化
list *s=p;
for(i=1;i<=w;i++)
{
for(j=1;j<=i;j++) ?//與數組形式差不多!
{
if(j==1||i==j)
rudui(p,1); ?//每行的頭、尾都為1,入對列
else ?//不是行頭尾時
{
if(y==2) ?//本行之內出對,使隊頭后移一位
{
rudui(l,s->tou->next->S_J);
s->tou->next=s->tou->next->next;
n++;
}
if(y==1) ?//從上一行出對,使得隊頭移到到本行
{
for(k=1;k<=(i-2)*(i-2+1)/2-n;k++)
//(i(i-2)*(i-2+1)/2-n 表示所需出對的次數,
{ ?rudui(l,s->tou->next->S_J);
//使得隊頭移動到本行開頭!
s->tou->next=s->tou->next->next;
t++;
}
y=2;n=n+t;
}
rudui(p,s->tou->next->S_J+s->tou->next->next->S_J);
//以上為核心算法,看上去有點復雜,但如果告訴你算法的思想,你大概就能明白了!
首先:楊輝三角的特點是第N行的中間值等于N-1行兩值的和(有點不標準,但你應該明白意思~~)
所以,我們要解決的是如何使隊頭定位到第N-1
明白了思路,我們就來實現:
首先,用鏈表p(s也一樣)保存當前入隊的值
然后,定位到N-1行,因為隊列采用的是單進單出,所以我們只能依次取隊頭元素讓隊頭指向到N-1
為止,并把取出的隊頭元素入l這個臨時的隊列
最后,由于隊頭已經移到了N-1行,所以在第N行的中間值就可以通過N-1兩數和入隊了!
由于p為當前隊列,而l出對元素組成的隊列,所以只要把l與p連接起來,就可以獲取楊輝三角的鏈表了!
PS:最好對著楊輝三角圖形來看更容易理解,本程序的就是根據這個思路來完成的!由于程序中調用其他
的函數,不便與修改!故程序實現的代碼很是雜亂(當然,也有技術問題~~),但這不要緊,最主要是
明白了思路,然后你可以通過你自己的方法來實現!!//
}
}
y=1;t=0;
}
while(l->tou->next)
{
rudui(f,l->tou->next->S_J);
l->tou->next=l->tou->next->next;
}
while(p->tou->next)
{
rudui(f,p->tou->next->S_J);
p->tou->next=p->tou->next->next;
} ?//以上用f接受l與p的元素,至此楊輝三角隊列完成!
printf("線性輸出為:\n");
chadui(f);
printf("金字塔輸出效果:\n");
for(i=0;i
{
for(j=w;j>=i;j--)
printf(" ?");
for(j=0;j<=i;j++)
{
printf("=
",f->tou->next->S_J);
f->tou->next=f->tou->next->next;
if(i==j)
printf("\n");
}
}
free(l);
free(p);
free(f);
}
int _tmain(int argc, _TCHAR* argv[])
{
list p;
int cd;
int i;
int XZ;
int sr;
int yh;
chushihua(&p);
printf("請輸入隊列長度:");
scanf("%d",&max);
for(i=1;i<=max;i++)
{
printf("請輸入第%d數據:",i);
scanf("%d",&cd);
rudui(&p,cd);
}
while(1)
{
printf("\t請選擇以下操作:\n");
printf("\t1、查看隊列!\n");
printf("\t2、入對!\n");
printf("\t3、出對!\n");
printf("\t4、楊輝三角!\n");
printf("\t5、退出 !\n");
fflush(stdin);
scanf("%d",&XZ);
switch(XZ)
{
case 1:
{
chadui(&p);
}break;
case 2:
{
printf("請輸入進隊元素:");
scanf("%d",&sr);
rudui(&p,sr);
printf("進對成功!\n");
}break;
case 3:
{
duitou(&p);
}break;
case 4:
{
printf("提示:程序會采用金字塔輸出!為了保證輸出效果,行數建議不要大于15!\n");
printf("請輸入行數:");
scanf("%d",&yh);
yanhui(yh);
}break;
case 5:goto la;
default:
printf("請確認輸出!\n");
}
}
la:
return 0;
}
效果圖:
總結
以上是生活随笔為你收集整理的杨辉三角队列c语言程序,C语言完整队列 与链式队列实现杨辉三角的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 气象报告是什么计算机领域,计算机辅助翻译
- 下一篇: 金蝶k3wise云服务器配置,金蝶K3W