嵌入式学习之路(二十)——数据结构(2)

嵌入式学习之路(二十)——数据结构(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
好啦,这个程序还是遇到挺多问题的,不过都解决了!大家也练练手!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值