数据结构分为抽象层、结构层和实现层,即逻辑结构、物理结构和运算结构。
程序的运行效率就是用时间复杂度来表示,存储效率用空间复杂度表示。
运算结构:
1、创建与销毁:分配资源,建立结构,释放资源
2、插入与删除:增加、减少数据元素
3、获取与修改:遍历、迭代、随机访问
4、排序与查找:算法应用
这篇文章用数组来编程
一、编写程序,用户输入任意数量个介于0到99之间的整数,按升序打印,不使用任何排序算法。
不用排序算法,即数与数之间不进行比较,这里利用的是数组,因为数组的下标永远是自然顺序的,因此,如果我们将输入的数字存在数组下标中,那么我们输出的数字自然就不用排序啦,而且可以像数组下标那样直接按升序打印。
下面给出代码,再进行分析
#include <stdio.h>
int main(void)
{
int arr[100] = {};
int data = 0;
int i = 0;
int j = 0;
while (scanf ("%d", &i) == 1)
{
if (0 <= i && i <= 99)
{
++arr[i];
}
}
for (i = 0;i < 100; i++)
{
for(j = 0;j < arr[i]; j++)
{
printf("%d ", i);
}
}
printf("\n");
return 0;
}
图中的数组下标即用来存储我们输入的整数,如果整数和下标相等,则在相应的位置加一,有相同的则多加几个,直到我们输入非数字以后,即表示输入完毕,则会输出结果:
[tangyanjun@VM_216_80_centos datastruct]$ a.out
20 10 55 98 98 78 44 -5 2 a
2 10 20 44 55 78 98 98
二、一个细胞游戏,生物体的周围的细胞数为N,N==3则产生宝宝,N<2则次细胞会孤独而死,N>3则会饥饿而死,N==2则保持原状。
/*********************************************************************************
* Copyright: (C) 2017 tangyanjun<519656780@qq.com>
* All rights reserved.
*
* Filename: life.c
* Description: This file
*
* Version: 1.0.0(06/09/2017)
* Author: tangyanjun <519656780@qq.com>
* ChangeLog: 1, Release initial version on "06/09/2017 09:24:57 PM"
*
********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <termios.h>
int getch(void) //为了去掉getchar的回车与回显
{
struct termios term_old;
ioctl(STDIN_FILENO, TCGETS, &term_old);
struct termios term_new = term_old;
term_new.c_lflag &= ~(ECHO | ICANON);
ioctl(STDIN_FILENO, TCSETS, &term_new);
int ch = getchar();
ioctl(STDIN_FILENO, TCSETS, &term_old);
return ch;
}
int main(void)
{
printf("群落宽度:");
int width;
scanf("%d", &width);
printf("群落高度:");
int height;
scanf("%d%*c", &height);
char cells[height][width];
srand(time(0));
int i, j;
for (i = 0; i < height; ++i)
for (j = 0; j < width; ++j)
cells[i][j] = rand() % 2 ? '*' : ' ';
int gen;
for (gen = 1;;++gen)
{
printf("+-");
for (i = 0; i < width * 2; ++i)
printf("-");
printf("+\n");
int live = 0;
for (i = 0; i < height; ++i)
{
printf("| ");
for (j = 0; j < width; ++j)
{
printf("%c ", cells[i][j]);
if(cells[i][j] == '*')
{
++live;
}
}
printf("|\n");
}
printf("+-");
for(i = 0; i < width * 2; ++i)
printf("-");
printf("+\n");
printf("第%d代, 有%d个活的。\n", gen, live);
printf("按<Q>键退出,按其他键继续...");
int ch = getch();
printf("\n");
if (ch == 'Q' || ch == 'q')
{
break;
}
for (i = 0; i < height; ++i) //前缀节省一丢丢时间
for (j = 0; j < width; ++j)
{
int u = i - 1;
int d = i + 1;
int l = j - 1;
int r = j + 1;
int around = 0;
if (u >= 0 && cells[u][j] == '*')
++around;
if (d < height && cells[d][j] == '*')
++around;
if (l >= 0 && cells[i][l] == '*')
++around;
if (r < width && cells[i][r] == '*')
++around;
if (u >= 0 && l >= 0 && cells[u][l] == '*')
++around;
if (u >= 0 && r < width && cells[u][r] == '*')
++around;
if (d < height && l >= 0 && cells[d][l] == '*')
++around;
if (d < height && r < width && cells[d][r] == '*')
++around;
if (around == 3)
cells[i][j] = '*';
else if (around != 2)
cells[i][j] = ' ';
}
} //主要打印我们的环境
return 0;
}
这里在程序执行时输入的群落宽度和群落高度根据显示屏大小来适当输入。