第1关:实现一个顺序存储的线性表

#include <stdio.h>
#include <stdlib.h>
#include "Seqlist.h"
SeqList* SL_Create(int maxlen)
// 创建一个顺序表
// 与SqLst_Free()配对
{SeqList* slist=(SeqList*)malloc(sizeof(SeqList));slist->data = (T*)malloc(sizeof(T)*maxlen);slist->max=maxlen;slist->len=0;return slist;
}
void SL_Free(SeqList* slist)
// 释放/删除 顺序表
// 与SqLst_Create()配对
{free(slist->data);free(slist);
}
void SL_MakeEmpty(SeqList* slist)
// 置为空表
{slist->len=0;
}
int SL_Length(SeqList* slist)
// 获取长度
{return slist->len;
}
bool SL_IsEmpty(SeqList* slist)
// 判断顺序表是否空
{return 0==slist->len;
}
bool SL_IsFull(SeqList* slist)
// 判断顺序表是否满
{return slist->len==slist->max;
}
T SL_GetAt(SeqList* slist, int i)
// 获取顺序表slist的第i号结点数据
// 返回第i号结点的值
{if(i<0||i>=slist->len) {printf("SL_GetAt(): location error when reading elements of the slist!\n");        SL_Free(slist);exit(0);}else {return slist->data[i];}
}
void SL_SetAt(SeqList* slist, int i, T x)
// 设置第i号结点的值(对第i号结点的数据进行写)
{if(i<0||i>=slist->len) {printf("SL_SetAt(): location error when setting elements of the slist!\n");        SL_Free(slist);exit(0);}else {slist->data[i]=x;}
}
bool SL_InsAt(SeqList* slist, int i, T x)
// 在顺序表的位置i插入结点x, 插入d[i]之前
// i的有效范围[0,plist->len]
{if (i<0 || i>slist->len || slist->len==slist->max)  {printf("SL_InsAt(): location error, or slist full.\n");return false;}for (int j=slist->len; j>=i+1; j--) {slist->data[j]=slist->data[j-1];}slist->data[i]=x;slist->len++;return true;
}
T SL_DelAt(SeqList* slist, int i)
// 删除顺序表plist的第i号结点
// i的有效范围应在[0,plist->len)内,否则会产生异常或错误。
// 返回被删除的数据元素的值。
{if (i<0 || i>=slist->len) {printf("SL_DelAt(): location error!\n");SL_Free(slist);exit(0);}T res=slist->data[i];for (int j=i; j<slist->len-1; j++) {slist->data[j] = slist->data[j+1];}slist->len--;return res;
}
int SL_FindValue(SeqList* slist, T x)
// 在顺序表表中查找第一个值为x的结点,返回结点的编号
// 返回值大于等于0时表示找到值为x的结点的编号,-1表示没有找到
{int i=0;while(i<slist->len && slist->data[i]!=x) i++;if (i<slist->len) return i;else return -1;
}
int SL_DelValue(SeqList* slist, T x)
// 删除第一个值为x的结点,
// 存在值为x的结点则返回结点编号, 未找到返回-1
{int i=SL_FindValue(slist, x);if (i>=0) {SL_DelAt(slist, i);}return i;
}
void SL_Print(SeqList* slist)
// 打印整个顺序表
{if (slist->len==0) {printf("The slist is empty.\n");        return;}//printf("The slist contains: ");for (int i=0; i<slist->len; i++) {printf("%d  ", slist->data[i]);}printf("\n");
}

第2关:实现一个链接存储的线性表

// 单链表实现文件
#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"
LinkList* LL_Create()
// 创建一个链接存储的线性表,初始为空表,返回llist指针。
{LinkList* llist=(LinkList*)malloc(sizeof(LinkList));llist->front=NULL;llist->rear=NULL;llist->pre=NULL;llist->curr=NULL;llist->position=0;llist->len=0;return llist;
}
void LL_Free(LinkList* llist)
// 释放链表的结点,然后释放llist所指向的结构。
{LinkNode* node=llist->front;LinkNode* nextnode;while(node){nextnode=node->next;free(node);node=nextnode;}free(llist);
}
void LL_MakeEmpty(LinkList* llist)
// 将当前线性表变为一个空表,因此需要释放所有结点。
{LinkNode* node=llist->front;LinkNode* nextnode;while(node){nextnode=node->next;free(node);node=nextnode;}llist->front=NULL;llist->rear=NULL;llist->pre=NULL;llist->curr=NULL;llist->position=0;llist->len=0;
}
int LL_Length(LinkList* llist)
// 返回线性表的当前长度。
{return llist->len;
}
bool LL_IsEmpty(LinkList* llist)
// 若当前线性表是空表,则返回true,否则返回TRUE。
{return llist->len==0;
}
bool LL_SetPosition(LinkList* llist, int i)
// 设置线性表的当前位置为i号位置。
// 设置成功,则返回true,否则返回false(线性表为空,或i不在有效的返回)
// 假设线性表当前长度为len,那么i的有效范围为[0,len]
{    int k;/* 若链表为空,则返回*/if (llist->len==0) return false;/*若位置越界*/if( i < 0 || i > llist->len){    printf("LL_SetPosition(): position error");return false;}/* 寻找对应结点*/llist->curr = llist->front;llist->pre = NULL;llist->position = 0;for ( k = 0; k < i; k++)    {llist->position++;llist->pre = llist->curr;llist->curr = (llist->curr)->next;}/* 返回当前结点位置*/return true;
}
int LL_GetPosition(LinkList* llist)
// 获取线性表的当前位置结点的编号
{return llist->position;
}
bool LL_NextPosition(LinkList* llist)
// 设置线性表的当前位置的下一个位置为当前位置。
// 设置成功,则返回true,否则返回false(线性表为空,或当前位置为表尾)
{if (llist->position >= 0 && llist->position < llist->len)/* 若当前结点存在,则将其后继结点设置为当前结点*/{llist->position++;llist->pre = llist->curr;llist->curr = llist->curr->next;return true;}else {return false;}
}
T LL_GetAt(LinkList* llist)
// 返回线性表的当前位置的数据元素的值。
{if(llist->curr==NULL){printf("LL_GetAt(): Empty list, or End of the List.\n");LL_Free(llist);exit(1);}return llist->curr->data;
}
void LL_SetAt(LinkList* llist, T x)
// 将线性表的当前位置的数据元素的值修改为x。
{if(llist->curr==NULL){printf("LL_SetAt(): Empty list, or End of the List.\n");LL_Free(llist);exit(1);}llist->curr->data=x;
}
bool LL_InsAt(LinkList* llist, T x)
// 在线性表的当前位置之前插入数据元素x。当前位置指针指向新数据元素结点。
// 若插入失败,返回false,否则返回true。
{    LinkNode *newNode=(LinkNode*)malloc(sizeof(LinkNode));if (newNode==NULL) {return false;}newNode->data=x;if (llist->len==0){/* 在空表中插入*/newNode->next=NULL;llist->front = llist->rear = newNode;}//当前位置为表头else if (llist->pre==NULL){/* 在表头结点处插入*/newNode->next = llist->front;llist->front = newNode;}else {  /* 在链表的中间位置或表尾后的位置插入*/newNode->next = llist->curr;llist->pre->next=newNode;}//插入在表尾后if (llist->pre==llist->rear)llist->rear=newNode;/* 增加链表的大小*/llist->len++;/* 新插入的结点为当前结点*/llist->curr = newNode;return true;
}
bool LL_InsAfter(LinkList* llist, T x)
// 在线性表的当前位置之后插入数据元素x。空表允许插入。当前位置指针将指向新结点。
// 若插入失败,返回false,否则返回true。
{LinkNode *newNode=(LinkNode*)malloc(sizeof(LinkNode));if (newNode==NULL) return false;newNode->data=x;if (llist->len==0)    {/* 在空表中插入*/newNode->next=NULL;llist->front = llist->rear = newNode;}else if (llist->curr == llist->rear || llist->curr == NULL)    {/* 在尾结点后插入*/newNode->next = NULL;llist->rear->next=newNode;llist->pre=llist->rear;llist->rear=newNode;llist->position=llist->len;}else{/* 在中间位置插入*/newNode->next = llist->curr->next;llist->curr->next=newNode;llist->pre=llist->curr;llist->position ++;}/* 增加链表的大小*/llist->len ++;/* 新插入的结点为当前结点*/llist->curr = newNode;return true;
}
bool LL_DelAt(LinkList* llist)
// 删除线性表的当前位置的数据元素结点。
// 若删除失败(为空表,或当前位置为尾结点之后),则返回false,否则返回true。
{    LinkNode *oldNode;/* 若表为空或已到表尾之后,则给出错误提示并返回*/if (llist->curr==NULL){    printf("LL_DelAt(): delete a node that does not exist.\n");return false;}oldNode=llist->curr;/* 删除的是表头结点*/if (llist->pre==NULL){    llist->front = oldNode->next;}/* 删除的是表中或表尾结点*/else if(llist->curr!=NULL){llist->pre->next = oldNode->next;}if (oldNode == llist->rear)    {/* 删除的是表尾结点,则修改表尾指针和当前结点位置值*/llist->rear = llist->pre;}/* 后继结点作为新的当前结点*/llist->curr = oldNode->next;/* 释放原当前结点*/free(oldNode);/* 链表大小减*/llist->len --;return true;
}
bool LL_DelAfter(LinkList* llist)
// 删除线性表的当前位置的后面那个数据元素。
// 若删除失败(为空表,或当前位置时表尾),则返回false,否则返回true。
{LinkNode *oldNode;/* 若表为空或已到表尾,则给出错误提示并返回*/if (llist->curr==NULL || llist->curr== llist->rear){printf("LL_DelAfter():  delete a node that does not exist.\n");return false;}/* 保存被删除结点的指针并从链表中删除该结点*/oldNode = llist->curr->next;llist->curr->next=oldNode->next;if (oldNode == llist->rear){/* 删除的是表尾结点*/llist->rear = llist->curr;}/* 释放被删除结点*/free(oldNode);/* 链表大小减*/llist->len --;return true;
}
int LL_FindValue(LinkList* llist, T x)
// 找到线性表中第一个值为x的数据元素的编号。
// 返回值-1表示没有找到,返回值>=0表示编号。
{LinkNode* p=llist->front;int idx=0;while(p!=NULL && p->data!=x) {idx++;p = p->next;}if (idx>=llist->len) {return -1; }else {return idx; }
}
int LL_DelValue(LinkList* llist, T x)
// 删除第一个值为x的数据元素,返回该数据元素的编号。如果不存在值为x的数据元素,则返回-1.
{int idx=LL_FindValue(llist, x);if (idx<0) return -1;LL_SetPosition(llist, idx);LL_DelAt(llist);return idx;
}
void LL_Print(LinkList* llist)
// 打印整个线性表。
{LinkNode* node=llist->front;while (node) {printf("%d ", node->data);node=node->next;}printf("\n");
}

头歌-数据结构与算法 - 线性表相关推荐

  1. 头歌 数据结构与算法答案 善用目录

    头歌 数据结构与算法答案 其他作业链接 非盈利文章,谢谢大家的分享和支持,如果大家有想要投稿的答案,也可以点击下面链接联系作者. 点击联系作者 作者博客 选择题加粗为正确答案 头歌java实训答案集 ...

  2. Java版数据结构与算法——线性表

    *************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如 ...

  3. 头歌平台数据结构与算法 线性表 第2关:实现一个连接存储的线性表

    目录 任务描述 相关知识 编程要求 测试说明 任务描述 本关任务要求针对链接存储方式实现的顺序表完成数据插入操作函数,以实现线性表数据插入功能. 相关知识 线性表的存储也可以采用链接存储方式来实现.链 ...

  4. 数据结构于算法—线性表

    目录 前言 线性表基本架构 顺序表 插入 删除 其他操作 链表 基本结构 插入 带头节点与不带头节点 插入尾 删除 其他 代码实现 顺序表 链表 测试与结果 总结 原创公众号:bigsai 文章收藏在 ...

  5. 数据结构与算法 | 线性表 —— 链表

    原文链接:wangwei.one/posts/java-- 链表 定义 逻辑结构上一个挨一个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着.恰恰相反,数据随机分布在内存中的各个位置,这种存储结构 ...

  6. 线性表算法题库_数据结构与算法(线性表)练习题

    .word 资料 . 三.写一个算法合并两个已排序的线性表. (用两种方法:数组表示的线性表(顺序表)和 指针表示的线性表(链表) ) 要求: 1 .定义线性表节点的结构,并定义节点的型和位置的型. ...

  7. educoder数据结构与算法 线性表 第2关:实现一个链接存储的线性表

    任务描述 本关任务:完成一个链接存储的线性表的小程序. 相关知识 线性表的存储也可以采用链接存储方式来实现.链接存储方式包括单链表.双链表和循环链表等形式. 下面描述了一种基于单链表的线性表实现方案: ...

  8. educoder数据结构与算法 线性表 第1关:实现一个顺序存储的线性表

    任务描述 本关任务:实现 step1/Seqlist.cpp 中的SL_InsAt.SL_DelAt和SL_DelValue三个操作函数,以实现线性表中数据的插入.删除与查找等功能. 相关知识 线性表 ...

  9. 数据结构与算法--线性表的查找

    一.查找的基本概念 1) 查找表: 查找表是由同一类型的数据元素(或记录)构成的集合         2) 由于集合中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构 3) 查找: 根据 ...

最新文章

  1. SpringBoot 框架中 使用Spring Aop 、创建注解、创建枚举类 使用过程记录
  2. ISME:南农韦中等消减土壤青枯菌生物障碍新策略
  3. 阿里云发布Quick BIV3.0,人人都能轻松进行在线数据分析
  4. 边缘计算云原生开源方案选型比较
  5. stm32 中bootloader、startup_stm32f10x_md.s的作用
  6. LGB 的 .feature_importance() 函数
  7. 东北农业大学网络教育计算机考试,THEOL网络教学综合平台-东北农业大学继续教育学院...
  8. idea The origin server did not find a current representation for the target resource or is not willi
  9. Shell(12)——awk(2)
  10. 【C++STL/红黑树】POJ 3481 DoubleQueue
  11. nssl1488-上升子序列【贪心,dp】
  12. 将指标标签与MicroProfile Metrics 2.0结合使用
  13. 和get redis_SpringBoot整合Redis,你get了吗?
  14. 【福利】囚犯抓绿豆,谁生谁死?
  15. 大学电路题目怎么搜_长沙理工大学2020真题浅析
  16. 在 CTreeCtrl 中枚举系统中的所有窗口!(II)
  17. vue路由1.0_【Vue】路由
  18. HEVC SAO技术阅读
  19. ARM存储器控制器的使用
  20. 摄氏度和开氏度的换算_摄氏温度和华氏、开氏温度_温度表示符号及单位换算...

热门文章

  1. hamlet.txt英文哈姆雷特下载及实现文本词频统计
  2. 【计算机视觉】图像分割与特征提取——基于Roberts、Prewitt、Sobel算子的图像分割实验
  3. 用博奥如何导入单项工程电子表_博奥工程系列软件实操手册(第五册)
  4. 全志R16_Camera支持列表芯片资料(Allwinner R16 Camera Support List)
  5. can总线用java怎么解析_CAN信号值解析
  6. 机床数据采集之新代(SYNETC)IP网络地址参数设定
  7. CRM系统基本的模板示例
  8. DZ论坛附件大小限制问题
  9. 数据可视化知识点汇总
  10. 盐城北大青鸟线上课丨云端相见,一起努力