链式队列
头文件
#ifndef _SEQUENCEQUEUE_H #define _SEQUENCEQUEUE_H #include <stdio.h> #include <stdlib.h> #define SIZE 1000 #define SUCCESS 10000 #define FAILURE 10001 #define TRUE 10002 #define FALSE 10003 struct queue { int data[SIZE]; int front; //队头指针(下标) int rear; //队尾指针 }; typedef struct queue Queue; int InitQueue(Queue *q); int EnterQueue(Queue *q, int e); int GetFront(Queue q); int LengthQueue(Queue q); int DeleteQueue(Queue *q); #endif
main函数
#include <stdio.h> #include "SequenceQueue.h" #include <stdlib.h> void Traverse(Queue q) { int i; for(i = q.front; i != q.rear; i++) { if (q.data[i] != 0) { printf("%d ", q.data[i]); } } printf("\n"); } int main() { int ret, num, i, top; Queue q1, q2; if (InitQueue(&q1) != SUCCESS || InitQueue(&q2) != SUCCESS) { printf("Init Failure!\n"); exit(1); } printf("Plesae input line:\n"); scanf("%d", &num); for (i = 0; i < num; i++) { if (i == 0) { EnterQueue(&q1, 0); EnterQueue(&q1, 1); EnterQueue(&q1, 0); } else { while (LengthQueue(q1) != 1) { top = DeleteQueue(&q1); EnterQueue(&q2, top + GetFront(q1)); } while (LengthQueue(q2) != 0) { EnterQueue(&q1, DeleteQueue(&q2)); } EnterQueue(&q1, 0); } Traverse(q1); } return 0; }
自定义函数
#include "SequenceQueue.h" int InitQueue(Queue *q) { if (NULL == q) { return FAILURE; } q->rear = q->front = 0; //初始化空队 return SUCCESS; } int EnterQueue(Queue *q, int e) { if (NULL == q) { return FAILURE; } if ((q->rear + 1) % SIZE == q->front) //队满 { return FAILURE; } q->data[q->rear] = e; q->rear = (q->rear + 1) % SIZE; return SUCCESS; } int GetFront(Queue q) { if (q.rear == q.front) { return FAILURE; } return q.data[q.front]; } int LengthQueue(Queue q) { return (q.rear - q.front + SIZE) % SIZE; } int DeleteQueue(Queue *q) { if (NULL == q) { return FAILURE; } if (q->rear == q->front) { return FAILURE; } int e = q->data[q->front]; q->front = (q->front + 1) % SIZE; return e; }
结果:
[root@localdomain SequenceQueue]# ./triangle Plesae input line: 8 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1
算法实现杨辉三角
思路:
源代码
#include<stdio.h> int main() { int i, j, n = 13; //若超过13行,linux输出的格式就不是三角形 printf("N="); while(n > 12) { scanf("%d", &n); //输入正确值保证屏幕输出正确的图形 } for( i = 0; i <= n; i++)//控制输出N行 { for( j = 0; j < 12-i; j++) printf(" "); //控制输出第i行前面的空格 for( j = 1; j < i+2; j++) printf("%6d", c(i , j)); //输出第i行的第j个值 printf("\n\n"); } return 0; } int c(x , y) //求杨辉三角形中第x行第y列的值 int x , y; { int z; if((y == 1) || (y == x + 1)) //若为x行的第一或者第x+1列,输出1 return (1); z = c(x-1 , y-1) + c(x-1 , y);//否则,其值为前面一行中第y-1列与第y列值的和 return(z); }
运行结果
[root@localdomain 9]# ./9 N=8 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1