ファレイシーケンスと二重リンクリスト

ファレイシーケンス

説明

ファレイシーケンスはシーケンスです。その第1レベルのシーケンスは(0 / 1、1 / 1)として定義され、このシーケンスは第2レベルに拡張されてシーケンス(0 / 1、1 / 2、1 / 1)を形成し、拡張は3番目の極にシーケンス(0 / 1、1 / 3、1 / 2、2 / 3、1 / 1)を形成し、4番目のレベルに展開してシーケンス(0 / 1、1 / 4、1 / 3、1)を形成します/ 2、2 / 3、3 / 4、1 / 1)。各レベルnで、前のレベルの2つの隣接するスコアa / cとb / dが(c + d)<= nを満たす場合、新しいスコア(a + b)/(c + d)2つのスコアの間に挿入します。与えられたnの値に対して、そのn番目のレベルのシーケンスに含まれる各スコアが順番に出力されます。

入力
入力整数n(0 <n <= 100)

出力
は、n番目のレベルのシーケンスに含まれる各スコアを順次出力し、各行は10個のスコアを出力し、同じ行の2つの隣接するスコアはタブで区切られます。

サンプル
入力

6

出力

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;
}chain;
void add(chain* head,int n)//插入操作
{
    
    
	chain* p, * q,*r;
	p= head->next;
	while (p->next)
	{
    
    
		q = p->next;
		if (q->b + p->b <= n)
		{
    
    
			r = (chain*)malloc(sizeof(chain));
			r->a = q->a + p->a;
			r->b = q->b + p->b;
			p->next = r;
			r->next = q;
		}
		p = p->next;
	}
}
void print(chain* head)//打印操作
{
    
    
	chain* q;
	q = head->next;
	int sum = 0;
	while (q)
	{
    
    
		sum++;
		if(sum!=10)
		printf("%d/%d\t", q->a, q->b);
		else
		{
    
    
			sum = 0;
			printf("%d/%d\n", q->a, q->b);
		}
		q = q->next;
	}
}
int main()
{
    
    
	chain* head, * p1, * p2;
	head = (chain*)malloc(sizeof(chain));
	head->next = NULL;
	int n;
	scanf("%d", &n);
	p1 = (chain*)malloc(sizeof(chain));
	p2 = (chain*)malloc(sizeof(chain));
	p2->next = head->next;
	head->next = p1;
	p1->next = p2;
	p1->a = 0;
	p1->b = p2->a = p2->b = 1;
	for (int i = 2; i <= n; i++)
		add(head, i);
	print(head);
	return 0;
}

二重リンクリスト

説明

単一リンクリストを学習した後、問題を解決する別の機能があります。単一リンクリストは、ポインタを使用してメモリ内の次の位置を見つけることができます。これは、簡単に壊れないチェーンです。しかし、単一にリンクされたリストには弱点があります-それらを参照することはできません。たとえば、リンクリストには2つのノードAとBがあります。これらの関係は、BがAの後継であり、AがBを指しているというものです。BからAまでは簡単に見つけることができますが、BからAを見つけることはできません。簡単なアイデアでこの問題を簡単に解決できます。二重にリンクされたリストを作成します。二重にリンクされたリストでは、AにはノードBへのポインターがあり、同時にBにはAへのポインターがあります。このようにして、リンクリストのヘッドノードの位置からリンクリスト全体のすべてのノードをトラバースできるだけでなく、リンクリストのエンドノードからすべてのノードをトラバースすることもできます。データの特定の列について、特定の順序で二重リンクリストを作成し、キーに従って対応するノードを見つけ、このノードの先行ノードのキーと後続ノードのキーを出力します。
入力

最初の行では、2つの正の整数n(ノードの数を表す)とm(検出されるキーワードの数を表す)。2行目はn個の数字です(n個の数字は繰り返されません)。これらのn個の数字を使用して、二重にリンクされたリストを作成します。次に、m個のキーワードがあり、それぞれが1行にあります。
出力

指定されたキーワードごとに、このキーワードの先行ノードキーワードと後続ノードキーワードを出力します。指定されたキーワードに先行または後続がない場合、出力されません。
注:指定された各キーワードの出力は1行を占めます。行の出力データ間にスペースがあり、行の最初と最後にスペースがありません。

サンプル
入力

10 3

1 2 3 4 5 6 7 8 9 0

3

5

0

出力

2 4

4 6

9

コード

#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
    
    
    int data;
    struct node* qian;
    struct node* hou;
}chain;
chain* set(int n)//建表
{
    
    
    chain* head, * p, * q, * end;
    head = (chain*)malloc(sizeof(chain));
    head->hou = NULL;
    end = head;
    for (int i = 0; i < n; i++)
    {
    
    
        p = (chain*)malloc(sizeof(chain));
        scanf("%d", &p->data);
        p->hou = end->hou;
        end->hou = p;
        p->qian = end;
        end = p;
    }
    return head;
}
int main()
{
    
    
    int n, m, i, x;
    chain* head, * p, * q, * end;
    scanf("%d %d", &n, &m);
    head = set(n);
    for (i = 0; i < m; i++)
    {
    
    
        scanf("%d", &x);
        q = head->hou;
        q->qian = NULL;
        while (q)
        {
    
    
            if (q->data == x)
            {
    
    
                if (q->hou == NULL)
                    printf("%d\n", q->qian->data);
                else if (q->qian == NULL)
                    printf("%d\n", q->hou->data);
                else printf("%d %d\n", q->qian->data, q->hou->data);
            }
            q = q->hou;
        }
    }
    return 0;
}

説明

今回はリンクリストの2つの質問を構成します。これらもCで書かれています。ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/rookie636/article/details/109038930