資料結構實驗之連結串列八:Farey序列
Problem Description
Farey序列是一個這樣的序列:其第一級序列定義為(0/1,1/1),這一序列擴充套件到第二級形成序列(0/1,1/2,1/1),擴充套件到第三極形成序列(0/1,1/3,1/2,2/3,1/1),擴充套件到第四級則形成序列(0/1,1/4,1/3,1/2,2/3,3/4,1/1)。以後在每一級n,如果上一級的任何兩個相鄰分數a/c與b/d滿足(c+d)<=n,就將一個新的分數(a+b)/(c+d)插入在兩個分數之間。對於給定的n值,依次輸出其第n級序列所包含的每一個分數。
Input
輸入一個整數n(0<n<=100)
Output
依次輸出第n級序列所包含的每一個分數,每行輸出10個分數,同一行的兩個相鄰分數間隔一個製表符的距離。
Sample Input
6
Sample Output
0/1 1/6 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 5/6 1/1
#include <stdio.h> #include <stdlib.h> typedef struct node { int a; int b; struct node *next; }LNode;//a代表分子,b代表分母,一個分數為一個結點 void creat(LNode *l,int n) { LNode *tail,*r,*p,*q; tail=(LNode *)malloc(sizeof(LNode)); tail=l->next;//用它來確保每個分數之間都把該插入的插入進來,新插入的結點與原結點之間也可以判斷一下,是否可以插入新的 while(tail->next!=NULL) { p=tail;//從tail之後開始進行插入 q=p->next; if(p->b+q->b<=n) { r=(LNode *)malloc(sizeof(LNode)); r->a=p->a+q->a; r->b=p->b+q->b; r->next=q; p->next=r; }//判斷條件,符合的話,插入到連結串列之中 tail=tail->next; } } void display(LNode *l) { LNode *p; int num=0; p=l->next; while(p!=NULL) { num++; if(num==10) { printf("%d/%d\n",p->a,p->b); num=0; } else printf("%d/%d\t",p->a,p->b);//”\t“代表製表符的距離 p=p->next; } } int main() { int i,n; scanf("%d",&n); LNode *l,*p,*q; l=(LNode *)malloc(sizeof(LNode)); p=(LNode *)malloc(sizeof(LNode)); q=(LNode *)malloc(sizeof(LNode)); p->a=0;p->b=1; q->a=1;q->b=1;//建立頭尾結點 q->next=NULL; l->next=p; p->next=q;//把已知結點連線成連結串列 for(i=2;i<=n;i++) { creat(l,i); }//分級一次進行連結串列的建立 display(l);//輸出連結串列 return 0; }