嵌入式学习之路(二十)——数据结构(2)
上次我们讲了排序的四个基本的算法,今天我们先来讲讲数据结构
一。什么是数据结构
是指相互之间具有一定联系的数据元素的集合。
元素之间的相互联系称为逻辑结构。
逻辑结构
1.集合:元素同属一个集合,没有其他的关系联系
2.线性结构:数据元素之间存在一对一的关系
3.树型结构:数据元素之间存在一对多的关系
4.图状结构:数据元素之间存在多对多的关系
二。数据结构的存储方式
1.顺序存储方式:用元素在存储器中的位置来表示之间的逻辑关系
2.链式存储方式:在一个元素中,存一个指向另一个元素的指针,指针表示他们之间的关系
三。数据结构的运算
1.建立一个数据结构
2.消除一个数据结构
3.从一个数据结构中删除一个元素
4.把一个数据元素插入到数据结构中
5.对一个数据结构进行访问
6.对数据结构中的元素进行修改
7.对一个数据结构进行排序
8.对一个数据结构进行查找
四。数据结构的实现----堆栈
1.堆栈
~~~~~~~
1)基本特征:后进先出。
2)基本操作:压入(push)、弹出(pop)。
3)实现要点:初始化空间、栈顶指针、判空判满。
我们来用链表来实现一下堆栈
我来出个题目吧:
题目要求:1.输入一个整数
2.再输入想要转换的进制
3.以输入的进制输出
大家看下我的效果;
请输入一个整数:15
请输入你要转换的进制:16
以16进制转换后的结果 = F
xuxb@xuxb-K42JZ:~/csdn/day18/sl$ ./sl
请输入一个整数:12
请输入你要转换的进制:2
以2进制转换后的结果 = 1100
/*************************************************
**
** 文件名称:sl_text.c
** 文件功能:输入一个整数,并且输入转换的进制
** 作者 :紫瞳标
** 时间 :2013-01-07
**
*************************************************/
#include <stdio.h>
#include "sl.h"
int main(void)
{
printf("请输入一个整数:");
unsigned int numb;
scanf("%d",&numb);
printf("请输入你要转换的进制:");
int base;
scanf("%d",&base);
STACK stack;
stack_init(&stack);/*初始化堆栈*/
do
{
stack_push(&stack,numb % base);/*往堆栈里面存数*/
}
while(numb /= base);/*直到0*/
printf("转换后的结果:");
while(! stack_empty(&stack))/*堆栈里面非空则弹出数*/
{
int digit = stack_pop(&stack);/*得到堆栈里面的数*/
if(digit < 10)
{
printf("%d",digit);
}
else
{
printf("%c",digit - 10 +'A');/*考虑十六进制*/
}
}
printf("\n");
stack_deinit(&stack);/*清空堆栈*/
return 0;
}
/*************************************************
**
** 文件名称:sl.c
** 文件功能:基于链表的堆栈
** 作者 :紫瞳标
** 时间 :2014-01-07
**
*************************************************/
#include <stdlib.h>
#include "sl.h"
/*************************************************
**
** 函数名称:creat_node()
** 函数功能:创建新节点
** 形式参数:新节点的数据,已经存在的节点指针
** 插在这个节点的前面,因为要实现堆栈
** 返回值 :新建节点的指针
**
*************************************************/
static STACK_NODE* create_node(int data,STACK_NODE *next)
{
STACK_NODE* node = malloc(sizeof(STACK_NODE));
node->data = data;
node->next = next;/*插在前面*/
return node;/*返回新建的节点指针*/
}
/*************************************************
**
** 函数名称:destroy_node()
** 函数功能:销毁节点
** 形式参数:要删除的节点指针
** 返回值 :该节点的下一个节点,因为要实现堆栈
**
*************************************************/
static STACK_NODE* destroy_node(STACK_NODE* node)
{
STACK_NODE *next = node->next;
free(node);
return next;
}
/*************************************************
**
** 函数名称:stack_init()
** 函数功能:初始化为空堆栈
** 形式参数:堆栈指针
** 返回值 :无
**
*************************************************/
void stack_init(STACK *stack)
{
stack->top = NULL;
}
/*************************************************
**
** 函数名称:stack_deinit()
** 函数功能:释放剩余节点并恢复到初始状态
** 形式参数:堆栈指针
** 返回值 :无
**
*************************************************/
void stack_deinit(STACK *stack)
{
while(stack->top)
{
stack->top = destroy_node(stack->top);
}
}
/*************************************************
**
** 函数名称:stack_empty()
** 函数功能:判断是否是空堆栈
** 形式参数:堆栈指针
** 返回值 :1 - 表示空 0 - 非空
**
*************************************************/
int stack_empty(STACK* stack)
{
return !(stack->top);
}
/*************************************************
**
** 函数名称:stack_push()
** 函数功能:向堆栈压入
** 形式参数:堆栈指针,节点的数据
** 返回值 :无
**
*************************************************/
void stack_push(STACK *stack,int data)
{
stack->top = create_node(data,stack->top);
}
/*************************************************
**
** 函数名称:stack_pop()
** 函数功能:从堆栈中取出数据,弹出
** 形式参数:堆栈指针
** 返回值 :弹出的数据
**
*************************************************/
int stack_pop(STACK *stack)
{
int data = stack->top->data;
stack->top = destroy_node(stack->top);
return data;
}
/*************************************************
**
** 函数名称:stack_top()
** 函数功能:从堆栈中读取栈顶数据,但是不弹出
** 形式参数:堆栈指针
** 返回值 :读取的数据
**
*************************************************/
int stack_top(STACK *stack)
{
return stack->top->data;
}
/*************************************************
**
** 函数名称:stack_size()
** 函数功能:读取堆栈里面数据个个数
** 形式参数:堆栈指针
** 返回值 :读取到的个数
**
*************************************************/
size_t stack_size(STACK *stack)
{
size_t size = 0;
STACK_NODE *node = NULL;
for(node = stack->top;node;node = node ->next)
{
++size;
}
return size;
}
/*************************************************
**
** 文件名称:sl.h
** 文件功能:sl.c的头文件
** 作者 :紫瞳标
** 时间 :2014-01-07
**************************************************/
#ifndef _SL_H
#define _SL_H
#include <sys/types.h>
/*节点*/
typedef struct StackNode {
int data;/*数据*/
struct StackNode *next;/*后指针*/
} STACK_NODE;
/*堆栈*/
typedef struct Stack {
STACK_NODE *top;/*栈顶*/
}STACK;
/*初始化为空堆栈*/
void stack_init(STACK *stack);
/*释放剩余节点并回复到初始状态*/
void stack_deinit(STACK *stack);
/*判断为空堆栈*/
int stack_empty(STACK *stack);
/*压入*/
void stack_push(STACK *stack,int data);
/*弹出*/
int stack_pop(STACK *stack);
/*取栈顶*/
int stack_top(STACK *stack);
/*取数量*/
size_t stack_size(STACK *stack);
#endif /*_SL_H*/
下面是makefile
sl:sl.o sl_test.o
gcc sl.o sl_test.o -o sl
sl.o:
gcc -c sl.c
sl_test.o:
gcc -c sl_test.c
clean:
rm sl.o sl_test.o sl
好啦,这个程序还是遇到挺多问题的,不过都解决了!大家也练练手!