【数据结构】清华出版社-刘小晶、朱蓉《数据结构渐进实践指导》第一章(个人手打版)

文章目录

1_1_SqList.cpp

cpp 复制代码
#include<stdio.h>
#include<malloc.h>

#define sql_size 100 // 线性表初始分配空间的容量
#define kuo 10      // 线性表扩展空间的量
#define ERROR 0 
#define OK 1
#define OVERFLOW -2
typedef int ElemType; // 数据元素的抽象数据类型,一般为int
typedef int Status;   // 函数的抽象数据类型,返回值一般为int


// 线性表结构体的定义
typedef struct
{
    ElemType* elem;
    int length;
    int listsize;
}SqList;


// 创建一个长度为n的顺序表L
Status SqList_Create(SqList &L,int n)
{
    if(sql_size >= n)
    {
        L.elem = (ElemType*)malloc((sql_size + kuo)*sizeof(ElemType)); //分配预定义大小的空间
        if(!L.elem) return OVERFLOW; //如果空间分配失败
        L.listsize = sql_size + kuo;
        L.length = n;
    }else //动态分配内存
    {
        L.length = n;
        L.listsize = n + kuo;
        L.elem = (ElemType*)malloc((n+kuo)*sizeof(ElemType));
        if(!L.elem) return OVERFLOW;
    }
    for(int i=0;i<L.length;++i) scanf("%d",&L.elem[i]); //依次输入顺序表中各个元素
    return OK;
}


// 在顺序表L中第i个元素插入新元素e
Status SqList_Insert(SqList &L,int i,ElemType e)
{
    if(i < 1 || i > L.length + 1) return ERROR; // 插入位置不正确
    if(L.length >= L.listsize) return OVERFLOW; // 表空间已满
    for(int j = L.length - 1;j >= i - 1;--j) L.elem[j+1] = L.elem[j];
    L.elem[i -1] = e;
    L.length++;
    return OK;
}


//在顺序表中删除第i个元素
Status SqList_Delete(SqList &L,int i)
{
    if(i < 1 || i > L.length) return ERROR; //合法范围1<=i<=n
    for(int j=i;j<=L.length-1;++j) L.elem[j - 1] = L.elem[j];
    L.length--;
    return OK;
}


// 在顺序表中查找值为e的元素,如果找到返回元素位置i,否则返回0
Status SqList_Search(SqList L,ElemType e)
{
    int i = 1;
    while(i <= L.length && L.elem[i - 1] != e) i++;
    if(i <= L.length) return i;
    else return 0; // 超出范围找不到
}


// 输出线性表L的元素
void SqList_OutPut(SqList L)
{
    for(int i=0;i<L.length;++i) printf(" %d ",L.elem[i]);
    printf("\n");
}

int main()
{
    SqList L;
    int n,i;
    ElemType e;

    scanf("%d",&n);
    SqList_Create(L,n);
    printf("原顺序表:\n");
    SqList_OutPut(L);

    scanf("%d %d",&i,&e);
    if(SqList_Insert(L,i,e) == OK) printf("插入后的顺序表:\n"),SqList_OutPut(L);
    else printf("插入失败!\n");

    scanf("%d",&i);
    if(SqList_Delete(L,i) == OK) SqList_OutPut(L);
    else printf("删除失败!\n");

    scanf("%d",&e);
    if(SqList_Search(L,e)) printf("元素e在第%d位\n",SqList_Search(L,e));
    else printf("查找失败!\n");

    return 0;
}

1_1_LinkList.cpp

cpp 复制代码
#include<stdio.h>
#include<malloc.h>

#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;


// 单链表结构体的定义
typedef struct LNode
{
    ElemType data;       // 数据域
    struct LNode * next; // 指针域
}LNode, *LinkList;


// 尾插法创建带头结点的单链表L
Status LinkList_Create(LinkList &L)
{
    ElemType node;
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    scanf("%d",&node); // 输入链表第一个数据值
    LinkList r = L; //引入一个尾指针,使其始终指向链尾
    while(node != 0) // 输入0结束
    {
        LinkList p = (LinkList)malloc(sizeof(LNode)); //为新结点分配空间
        if(!p) return ERROR;
        p->data = node; //将输入的数据值存入新结点的数据域
        r->next = p;    //修改链,使新结点p插入到链尾
        r = p;           //
        scanf("%d",&node); 
    }
    r->next = NULL;
    return OK; 
}


// 在单链表L第i个数据元素之前插入新的元素e
Status LinkList_Insert(LinkList &L,int i,ElemType e)
{
    LinkList p = L, s; //p为头结点,s为引入的插入指针
    int j = 0;         //j为p指针所在位序号
    while(p && j < i-1) //表非空且i合法范围[1,n+1(算上头结点)],这里判断小于1部分非法
    {
        p = p->next;
        ++j;
    }
    if(!p || j > i-1) return ERROR; //扫描指针此时为空或找不到前驱结点
    s = (LinkList)malloc(sizeof(LNode)); //参数新结点
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
}


// 删除单链表L中的i个数据元素
Status LinkList_Delete(LinkList &L,int i)
{
    LinkList p = L , q;
    int j = 0;
    while(p->next && j < i-1)
    {
        p = p->next;
        j++;
    }
    if(!p || j > i-1) return ERROR;
    q = p->next;
    p->next = q->next;
    free(q);
    return OK;
}


//查找单链表L中的第i个元素
ElemType LinkList_Locate(LinkList L,int i,ElemType &e)
{
    LinkList p = L->next; //p指向链表中的首结点
    int j = 1; //j记录p所在位序号
    while(p && j < i)
    {
        p = p->next;
        j++;
    }
    if(!p) return ERROR;
    e = p->data;
    return e;
}


// 输入单链表L
void LinkList_OutPut(LinkList L)
{
    LinkList p = L->next; //指向带头结点的单链表的首结点
    while(p) printf(" %d ",p->data),p = p->next;
    printf("\n");
}


int main()
{
    LinkList L;
    int i;
    ElemType e;

    LinkList_Create(L);
    printf("原链表:\n");
    LinkList_OutPut(L);

    scanf("%d",&i);
    scanf("%d",&e);
    if(LinkList_Insert(L,i,e)) printf("插入后链表:\n"),LinkList_OutPut(L);
    else printf("插入失败!\n");

    scanf("%d",&i);
    if(LinkList_Delete(L,i)) printf("删除后的链表:\n"),LinkList_OutPut(L);
    else printf("删除失败!\n");

    scanf("%d",&i);
    if(LinkList_Locate(L,i,e)) printf("%d",LinkList_Locate(L,i,e));
    else printf("查找失败!\n");

    return 0;
}

#1_2_cardgame.cpp

cpp 复制代码
/*
2. 实践内容
纸牌游戏内容的具体描述是:有编号为1~52的52张纸牌按编号顺序摆放,而且都是
正面向上。现从第2张开始,以2为基数,对编号是2的倍数的牌翻一次,直到最后一张牌;
然后,又从第3张开始,以3为基数,对编号是3的倍数的牌翻一次,直到最后一张牌;接
着,再从第4张开始,以4为基数,对编号是4的倍数的牌翻一次,直到最后一张牌;以此类推,再依次以5,6,7,...,52为基数,对相应编号的倍数的牌进行翻牌,最后输出正面向上
的那些纸牌。请编程模拟这个游戏过程,并输出最后正面上的所有纸牌编号和纸牌的张数。

3. 实践要求
(1)为使上述纸牌游戏具有普适性,要求纸牌的张数由用户自主设定。
(2)根据纸牌游戏规则及其操作特性,自主分析并选择恰当的数据存储结构。
(3)抽象出本游戏中所涉及的关键性操作模块,并给出其接口描述及其实现算法。
(4)输入输出说明:本实践要求输入的内容只有用户自设定的纸牌张数n。输出的内容包括纸牌游戏结束后正面向上的所有纸牌编号和纸牌的张数。为了能使输入与输出信息
更加人性化,可以在输入或输出信息之前适当添加有关提示信息。
*/

#include<stdio.h>
#include<malloc.h>

#define ElemType bool

typedef struct
{
    ElemType* card_status; //表示状态
    int card_size; //纸牌总数
}CardList;


bool Game_Init(CardList &L,int n)
{
    L.card_status = (bool*)malloc((n+1)*sizeof(ElemType));
    if(!L.card_status) return false;
    for(int i=1;i<=n;++i) L.card_status[i] = true;
    L.card_size = n;
    return true;
}


void Game_Progress(CardList &L)
{
    for(int i = 2;i <= L.card_size;++i)
    {
        for(int j = i;j <= L.card_size;++j)
        {
            if(j % i == 0) L.card_status[j] = !L.card_status[j];
        }
    }
}

int main()
{
    CardList L;
    int n,cnt=0;;
	printf("请输入纸牌总数:\n");
    scanf("%d",&n);
	printf("%d\n",n);
    Game_Init(L,n);
    Game_Progress(L);
    printf("正面向上的纸牌为:\n");
    for(int i=1;i<=L.card_size;++i)
    {
        if(L.card_status[i]) cnt++,printf(" %d ",i);
    }
	printf("\n正面向上纸牌数为:\n%d",cnt);
    return 0;
}

后续要用链表进行管理系统开发和实践编程过于复杂且冗余,就不进行编写可以查看书中的实现

相关推荐
Dizzy.51722 分钟前
数据结构(查找)
数据结构·学习·算法
专注VB编程开发20年3 小时前
除了 EasyXLS,加载和显示.xlsx 格式的excel表格,并支持单元格背景色、边框线颜色和粗细等格式化特性
c++·windows·excel·mfc·xlsx
分别努力读书3 小时前
acm培训 part 7
算法·图论
武乐乐~3 小时前
欢乐力扣:赎金信
算法·leetcode·职场和发展
Jared_devin3 小时前
数据结构——模拟栈例题B3619
数据结构
'Debug3 小时前
算法从0到100之【专题一】- 双指针第一练(数组划分、数组分块)
算法
sushang~4 小时前
leetcode21.合并两个有序链表
数据结构·链表
Fansv5874 小时前
深度学习-2.机械学习基础
人工智能·经验分享·python·深度学习·算法·机器学习
夏天的阳光吖4 小时前
C++蓝桥杯基础篇(四)
开发语言·c++·蓝桥杯
oioihoii4 小时前
C++17 中的 std::to_chars 和 std::from_chars:高效且安全的字符串转换工具
开发语言·c++