一、数据结构与算法练习整理

1.关于栈的应用实例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef struct Node // 节点
{
    int data;
    struct Node *pNode;
} NODE, *PNODE;

typedef struct Stack // 栈
{
    PNODE pTop;
    PNODE pBottom;
} STACK, *PSTACK;

void init_stack(PSTACK); // 初始化
void push_stack(PSTACK); // 压栈
bool go_stack(PSTACK);   // 出栈
void traverse_stack(PSTACK ps)
{
    if (NULL == ps->pBottom)
    {
        printf("该栈已销毁!请初始化。\n");
        return 0;
    }
    else if (ps->pTop == ps->pBottom)
    {
        printf("空栈!\n");
        return 0;
    }
    PNODE t = ps->pTop;
    while (t != ps->pBottom)
    {
        printf("%d\n", t->data);
        t = t->pNode;
    }
    return 0;
}
void empty_stack(PSTACK);   // 清空
void destroy_stack(PSTACK); // 销毁
// 主函数
int main(void)
{
    STACK s;
    init_stack(&s);
    push_stack(&s);
    push_stack(&s);
    push_stack(&s);
    go_stack(&s);
    traverse_stack(&s);
    empty_stack(&s);
    traverse_stack(&s);
    // destroy_stack(&s);
    // traverse_stack(&s);
    return 0;
}
// 初始化
void init_stack(PSTACK ps)
{
    ps->pTop = (PNODE)malloc(sizeof(NODE));
    if (ps->pTop == NULL)
    {
        printf("内存不足!1\n");
        exit(-1);
    }
    ps->pBottom = ps->pTop;
    ps->pBottom->pNode = NULL;
    return;
}
void push_stack(PSTACK ps)
{
    PNODE t = (PNODE)malloc(sizeof(NODE));
    if (NULL == t)
    {
        printf("内存不足!2\n");
        exit(-1);
    }
    printf("要压值:");
    scanf("%d", &t->data);
    t->pNode = ps->pTop;
    ps->pTop = t;
    return;
}
// 出栈
bool go_stack(PSTACK ps)
{
    if (ps->pTop == ps->pBottom)
    {
        printf("空栈!");
        return false;
    }
    PNODE t = ps->pTop;
    printf("出栈的元素是:%d\n", t->data);
    ps->pTop = ps->pTop->pNode;
    free(t);
    return true;
}
// 遍历

void empty_stack(PSTACK ps)
{
    while (ps->pTop != ps->pBottom)
    {
        PNODE t = ps->pTop;
        ps->pTop = ps->pTop->pNode;
        free(t);
    }
    printf("已清空!\n");
    return;
}

2、关于循环队列的应用实例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//该长度要大于实际操作队列长度+1,以避免数据刚好卡在临界情况
#define len_size 13
typedef struct buffer
{
    int buf[len_size];
    volatile int in;
    volatile int out;
} ris_buf;
/* 循环队列 ,对数据要求要小于队列长度的数据传输才可,超出队列长度数据传输会出现两种情况
1、一种是刚好是队列长度的数据长度,传输为零。
2、超出队列长度的数据,其长度传输为超出的数据长度。*/
//入队
int write(ris_buf *sring, int *wbuf, int len)
{
    int i;

    for (i = 0; i < len; i++)
    {
        if ((sring->in + 1) % len_size == sring->out)
        {
            printf("full");
        }
        sring->buf[sring->in] = wbuf[i];
        sring->in = (++(sring->in)) % len_size;
    }
    return 0;
}
//出队
int read(ris_buf *sring, int *rbuf, int len)
{
    int i;
    for (i = 0; i < len; i++)
    {
        if (sring->out == sring->in)
        {
            printf("NULL");
        }
        rbuf[i] = sring->buf[sring->out];
        sring->out = (++sring->out) % len_size;
    }
    return 0;
}
//获取队列中的数据长度
int date_len(ris_buf *sring)
{

    return (sring->in - sring->out + len_size) % len_size;
}

int main(int argc, char **argv)
{
    ris_buf ringbuf = {0};
    /*要写入数据区的数据*/
    int buf1[12] = {164, 7, 89, 41, 12, 3, 97, 81, 23, 12, 56, 78};
    /*接收数据区*/
    int buf3[12] = {0};
    /*进行数据入队操作*/
    write(&ringbuf, buf1, 12);
    /*进行出队操作,buf3的数据应当和buf1的数据一致。*/
    read(&ringbuf, buf3, date_len(&ringbuf));
    int i=0;
    do
    {
    printf(" $ %d \n",buf3[i]);
	i++;
	}while(i<12)
    printf("\n");
    getchar();
    return 0;
}

3、关于单项队列应用实例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct stdool
{
    int *buf;
    int in;
    int out;
    int size;

} std;
// 单项队列受限于in和out的数据类型的最大值。
std stdol;
#define min(x, y) ((x) < (y) ? (x) : (y))
int init(int *rbuf, int size)
{
    std *per = &stdol;
    if (rbuf == NULL || size == 0)
    {
        return -1;
    }
    memset(per, 0, sizeof(stdol));
    per->buf = rbuf;
    per->in = per->out = 0;
    per->size = size;
    return 0;
}

int write(int *wbuf, int len)
{
    int i = 0, j = 0;
    std *per = &stdol;
    j = per->in % per->size;
    len = min(len, per->size - per->in + per->out);
    i = min(len, per->size - j);
    memcpy(per->buf + j, wbuf, i);
    memcpy(per->buf, wbuf + i, len - i);
    per->in += len;
    return len;
}

int read(int *rbuf, int len)
{
    int i = 0, j = 0;
    std *per = &stdol;
    j = (per->out % per->size);
    len = min(len, per->in - per->out);
    i = min(len, per->size - j);
    memcpy(rbuf, per->buf + j, i);
    memcpy(rbuf + i, per->buf, len - i);
    per->out += len;
    return len;
}
int get_speac_len()
{
    std *per = &stdol;
    return (per->size - (per->in - per->out));
}
int get_date_len()
{
    std *per = &stdol;
    return (per->in - per->out);
}
void clear()
{
    std *per = &stdol;
    per->in = per->out = 0;
}

int main(int argc, char **argv)
{

    int buf[10] = {0}, buf1[10] = {15, 49, 8, 71, 23, 19, 68, 7, 8, 9};
    int len;
    init(buf, sizeof(buf));

    write(buf1, sizeof(buf));
    len = get_date_len();
    if (len > 0)
    {
        len = len > 40 ? 40 : len;
        read(buf, len);
    }
    int i = 0;
    while (i < 10)
    {
        printf("$ %d \n", buf[i]);
        i++;
    }
    getchar();
    return 0;
}

4、单链表的应用实例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef struct list
{
    int date;
    struct list *next;

} li, *lis;
/*
    单链表
    1、初始化
    2、显示
    3、头插
    4、插入
    5、删除
    6、删除
    7、排序
*/
lis init(lis new)
{
    new = (lis)malloc(sizeof(li));
    new->next = NULL;
    return new;
}
// 显示数据
int show(lis n_list)
{

    while (n_list->next)
    {
        n_list = n_list->next;
        printf("-%d", n_list->date);
    }
    return 0;
}
// 以头插入法进行插入
lis add(lis n_list, int date)
{
    lis new = (lis)malloc(sizeof(li));
    new->date = date;
    new->next = NULL;
    new->next = n_list->next;
    n_list->next = new;
    return n_list;
}
// 在x位置插入数据date
bool insert(lis n_list, int x, int date)
{

    int i = 0;
    while (n_list != NULL && i < x - 1)
    {
        n_list = n_list->next;
        ++i;
    }
    if (i > x - 1 || NULL == n_list)
    {
        return 0;
    }
    lis new = (lis)malloc(sizeof(li));
    new->next = NULL;
    new->date = date;

    new->next = n_list->next;
    n_list->next = new;
    return 1;
}
// 删除x位置数据
bool delets(lis n_list, int x)
{
    int i = 0;
    lis p;
    while (n_list->next != NULL && i < x - 1)
    {
        n_list = n_list->next;
        p = n_list;
        ++i;
    }
    if (i > x - 1 || n_list->next == NULL)
    {
        return 0;
    }
    lis q = p->next;
    p->next = p->next->next;
    free(q);
    q = NULL;
    return 1;
}
// 查找date数据的位置,与出现的总数量
lis find(lis list_n, int date)
{
    int i, j;
    while (list_n->next)
    {
        if (list_n->date == date)
        {
            i++;
            printf("%d", j); // 序号
        }
        j++;
        list_n = list_n->next;
    }
    printf("tol: %d ", i); // 总数量

    return list_n;
}
// 更改node位置的数据为date
lis list_exch(lis list_n, int node, int date)
{
    for (int i = 1; i < node; i++)
    {
        list_n = list_n->next;
    }
    add(list_n, date);
    return list_n;
}
// 该种删除数据只能删除遇到第一个相同数据,当数据中存在多个相同数据时操作就不实用了。
lis del(lis n_list, int date)
{
    lis p;
    while (n_list->date != date)
    {
        p = n_list;
        n_list = n_list->next;
        /* code */
    }

    p->next = n_list->next;

    free(n_list);
    return n_list;
}
// 排序
int sort(lis n_list, int len)
{
    lis p, q, t;
    int j, i;
    for (i = 0, p = n_list->next; i < len - 1; i++, p = p->next)
    {
        for (j = i + 1, q = p->next; j < len; j++, q = q->next)
        {
            if ((p->date) > (q->date))
            {
                p->date = p->date ^ q->date;
                q->date = p->date ^ q->date;
                p->date = p->date ^ q->date;
            }
            /* code */
        }
    }

    return 0;
}

int main(int argc, char **argv)
{
    lis list_new = init(list_new);

    for (int i = 1; i < 10; i++)
    {
        add(list_new, i);
    }
    show(list_new);
    printf("--\n");

    insert(list_new, 5, 56);
    show(list_new);
    printf("--\n");
    // del(list_new, 3);
    delets(list_new, 4);
    show(list_new);
    printf("--\n");
    sort(list_new, 9);
    show(list_new);

    getchar();
    return 0;
}

5、双向链表的应用实例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct list
{
    int date;
    struct list *prev;
    struct list *next;
} li, *lis;
/*双向链表
1、初始化
2、尾加法
3、插入
4、删除
6、显示

*/
lis init(lis list_n)
{
    list_n = (lis)malloc(sizeof(li));
    list_n->date = 0;

    list_n->next = list_n->prev = NULL;

    return list_n;
}
lis add(lis list_n, int x)
{
    int date;
    for (int i = 0; i < x; i++)
    {
        printf("请输入:");
        scanf("%d", &date);

        lis node = (lis)malloc(sizeof(li));
        node->date = date;
        node->next = node->prev = NULL;

        list_n->next = node;
        node->prev = list_n;

        list_n = list_n->next;
    }
    return list_n;
}
lis insert(lis list_n, int x, int date)
{
    lis node = (lis)malloc(sizeof(li));
    node->date = date;
    node->next = node->prev = NULL;

    if (x == 1)
    {
        node->next = list_n;
        list_n->prev = node;
        list_n = node;
    }
    else
    {
        for (int i = 1; i < x - 1; i++)
        {
            list_n = list_n->next;
        }
        if (list_n->next == NULL)
        {
            list_n->next = node;
            node->prev = list_n;
        }
        else
        {
            list_n->next->prev = node;
            node->next = list_n->next;
            list_n->next = node;
            node->prev = list_n;
        }
    }
    return list_n;
}

lis del(lis list_n, int date)
{
    while (list_n)
    {
        if (list_n->date == date)
        {
            list_n->prev->next = list_n->next;
            list_n->next->prev = list_n->prev;
            free(list_n);
            return list_n;
        }
        list_n = list_n->next;
    }
    return list_n;
}

lis show(lis list_n)
{
    while (list_n->next)
    {
        list_n = list_n->next;
        printf("-%d", list_n->date);
    }
}

int main(int argc, char **argv)
{
    lis list;
    int x, xi;
    list = init(list);

    add(list, 5);
    printf("\n");
    show(list);

    printf("\n");
    puts("请输入要删除的数值:");
    scanf("%d", &x);
    del(list, x);
    show(list);

    printf("\n");
    puts("请输入在第x位置要插入的数值:");

    scanf("%d %d", &xi, &x);
    insert(list, xi + 1, x);
    show(list);
    getchar();
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值