天天看點

楊輝三角的C軟體實作

采用連結清單方式實作,linux GCC 編譯 ,理論上可以列印1-一個int長的楊輝三角,但是由于計算溢出,測試隻能到35行。

楊輝三角的C軟體實作
#ifndef YANGHUI_H
#define YANGHUI_H

typedef struct Node{
    int data;
    struct Node *link;
}NODE;

#endif
           
#include <stdio.h>
#include <stdlib.h>
#include "YanghuiTriangle.h"


NODE *createSingleLink(NODE *head,int data)
{
    NODE *h = head;
    NODE *p = (NODE *)malloc(sizeof(NODE));
    p->data = data;
    p->link = NULL;
    if(NULL == head)
    {
        h = p;
        goto END;
    }
    while(NULL != head->link)
    {
        head = head->link;
    }
    head->link = p;
END:    return h;
}

void PrintGap(int numGap)
{
    int i = 0;
    for(i = 0; i<numGap;i++)
        printf(" ");
}
void Yanghui(int num)
{
    int i = num;
    int j = num;
    NODE *head = NULL;
    NODE *tmpHead = NULL;
    for(i=num-1 ; i>=0 ; i--)
    {
        PrintGap(i);
        for(j=0; j<(num-i); j++)
        {
            if(NULL != head)
            {
                if(0 != j)
                {
                    if(NULL != head->link)
                    {
                        int tmp = (head->data)+(head->link->data); 
                        printf("%d",tmp);
                        PrintGap(1);
                        head = head->link;
                        tmpHead = createSingleLink(tmpHead,tmp);
                    }
                    else
                    { 
                        printf("%d",head->data);
                        tmpHead = createSingleLink(tmpHead,head->data);
                        head = head->link;
                        head = tmpHead;
                        tmpHead = NULL;
                    }
                } 
                else if(0==j)
                {
                    printf("%d",1);
                    PrintGap(1);
                    tmpHead = createSingleLink(tmpHead,1);
                } 
            }
            else if(NULL == head)
            {
                printf("%d",1);
                head = createSingleLink(head,1);
            }
        }
        printf("\n");
    }
    NODE *frr =NULL;
    while(NULL !=head)
    {
        frr = head;
        head = head->link;
        free(frr);
    }
    while(NULL !=tmpHead)
    {
        frr = tmpHead;
        tmpHead = tmpHead->link;
        free(frr);
    }
}

void main(int argc,char *argv[])
{
    if(argc<2)
    {
        printf("Usage:\n./a.out num\n");
        exit(0);
    }
    int num = atoi(argv[1]);
    Yanghui(num);
    //printf("the input num : %d\n",num);
}
           

繼續閱讀