线性表的顺序表示

线性表的顺序表示,是通过构造一个结构体实现的。结构体内包含一个定长数组和一个顺序表的长度。一维数组可以是静态分配或者是动态分配的。这里使用的是静态分配的方法。
代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>typedef int Position;
typedef struct LNode *List;#define MAXSIZE 100struct LNode{int Data[MAXSIZE];Position last;
};List InitialList(){List L;L = (List) malloc(sizeof(List));L->last = -1;return L;
}bool judgeEmpty(List L){if (L->last == -1) return true;else return false;
}bool insert(List L, int element, int position){if (position < 0){printf("Error:插入的位置小于0\n");return false;}if (position >= MAXSIZE){printf("Error: 插入的位置超出最大长度\n");return false;}if (L->last >= MAXSIZE - 1){printf("Error:表已经满了,无法继续插入.\n");}for (int i = L->last; i >= position; i--){L->Data[i + 1] = L->Data[i];}L->Data[position] = element;L->last++;return true;
}Position find(List L, int element){int i = 0;while(L->Data[i] != element && i <= L->last)i++;if (i == L->last) return -1;else return i;}bool deleteByIndex(List L, int index){if (L->last == -1){printf("The list is empty!\n");return false;}if (index < 0 || index > L->last){printf("Index is valid\n");return false;}for(int i = index; i < L->last + 1; i++){L->Data[i] = L->Data[i+1];}L->last--;return true;
}bool deleteByElement(List L, int element){if (L->last == -1){printf("The list is empty!\n");return false;}int index = find(L, element);return deleteByIndex(L, index);
}void printList(List L){if (L->last == -1){printf("The List is empty!\n");return;}int length = L->last + 1;for (int i = 0; i < length; i++){printf("%d \t", L->Data[i]);}printf("\n");
}// 直接翻转整个线性表
bool reverse(List L){if (L->last == -1){printf("The list is empty\n");return false;}for (int i = 0; i < (L->last + 1)/2; i++){int temp = L->Data[i];L->Data[i] = L->Data[L->last - i];L->Data[L->last - i] = temp;}return true;
}// 反转线性表下标范围在[from, to]位置之内的数。
bool reversePart(List L, int from, int to){if(L->last == -1){printf("The list is empty.\n");return false;}if(from > to){printf("ERROR: arg: from > to\n");return false;}if((from < 0 || to < 0) && (from > L->last || to > L->last)){printf("The from or to is out of array bound\n");return false;}for (int i = 0; i < (to - from + 1) / 2; i++){int temp = L->Data[from + i];L->Data[from + i] = L->Data[to - i];L->Data[to-i] = temp;}return true;
}// 实现线性数组整体左移 K 步
bool leftShift(List L, int leftStep){if (leftStep < 0 || leftStep > L->last + 1){printf("The left steps is not valid.\n");return false;}reversePart(L, 0, leftStep-1);reversePart(L, leftStep, L->last);reversePart(L, 0, L->last);return true;
}int main()
{List L = InitialList();insert(L, 2, 0);printList(L);insert(L, 3, 1);insert(L, 4, 1);printList(L);reverse(L);printList(L);reversePart(L, 1, 2);printList(L);leftShift(L, 1);printList(L);printf("%d", 3/2);return 0;
}

线性表的链式表示

线性表的链式存储又称为单链表,每一个数据存储在一个链表结点中。每一个链表结点除了保存自身元素之外,还额外存储了下一个结点的指针域。

实现的代码如下:

#include <stdio.h>
#include <stdlib.h>typedef int ElemType;typedef struct LNode{ElemType data;struct LNode* next;
} LNode;
typedef LNode* LinkList;LinkList initial(int initialVal){LinkList s1 = (LinkList)malloc(sizeof(LNode));s1->next=NULL;LinkList s2 = (LinkList)malloc(sizeof(LNode));s2->next=NULL;s2->data=initialVal;s1->next=s2;return s1;
}int getListLength(LinkList L){if(L == NULL){return 0;}LinkList p = L->next;int len = 0;while(p != NULL){p = p->next;len ++;}return len;
}LinkList insert_head(LinkList L, int data){// 头插法,逆向建立链表LinkList head = (LinkList)malloc(sizeof(LNode));head->data = data;head->next = NULL;if(L == NULL){// 头节点无意义L = (LinkList)malloc(sizeof(LNode));L->next = head;return L;}else{head->next = L->next;L->next = head;return L;}
}LinkList insert_end(LinkList L, int data){LinkList tail = (LinkList)malloc(sizeof(LNode));tail->data = data;tail->next = NULL;LinkList s = L;while(s != NULL){if(s->next == NULL){s->next = tail;break;}// printf("%d", s->next->data);s = s->next;}return L;
}LinkList insert(LinkList L, int index, int data){int len = getListLength(L);if(index > len || index < 0){printf("ERROR: the index is out of bound");return NULL;}if(index == 0){return insert_head(L, data);}if(index == len){return insert_end(L, data);}LinkList p = L->next;int count = 0;while(1){if(count == index - 1){LinkList pnext = p->next;LinkList newNode = (LinkList)malloc(sizeof(LNode));newNode->data=data;newNode->next = pnext;p->next=newNode;return L;}count++;p = p->next;}return L;
}LinkList findDataByVal(LinkList L, int data){LinkList s = L->next;while(s != NULL){if(s->data == data){return s;}s = s->next;}return NULL;
}LinkList findDataByIndex(LinkList L, int index){if(index < 0){printf("ERROR: index is lower than 0.");return NULL;}LinkList p = L->next;int couter = 0;while(p != NULL){if(couter == index){return p;}couter++;p = p->next;}return NULL;
}LinkList deleteByPtr(LinkList target){/*给定一个链表和一个结点指针,要求从链表中删除该结点指针,做法一般有两个:1. 从头遍历,直到定位到该目标指针,时间复杂度为 O(n)2. 直接删除目标结点的后继结点,并将后继结点的值赋给自身结点,时间复杂度为O(1);这里采用第二种方法*/if(target->next == NULL){target=NULL;}else{LinkList p = target->next;target->next = p->next;target->data = p->data;free(p);}return target;
}LinkList  deleteByIndex(LinkList L, int index){LinkList target = findDataByIndex(L, index);return target == NULL ? L : deleteByPtr(target);
}void printList(LinkList L){LinkList p = L->next;while(p != NULL){printf("%d \t", p->data);p = p->next;}printf("\n");
}int main()
{LinkList L = initial(0);printf("初始化:\n");printList(L);insert_head(L, 3);insert_head(L, 4);insert_head(L, 5);printf("头部插入 3, 4,5\n");printList(L);insert_end(L, 1);insert_end(L, 2);printf("尾部插入 1, 2\n");printList(L);insert(L, 2, 100);printf("index %d 位置插入 %d\n", 2, 100); //TOFIXprintList(L);LinkList p = findDataByIndex(L,0);printf("index 为 0的位置值为 %d\n",  p->data);p = findDataByVal(L, 100); // TOFIXprintf("data 为 100 的位置值为 %d\n", p->data);deleteByIndex(L, 2);printf("删除位置为2的数值\n");printList(L);}

以上两份代码仅仅通过一些小小的测试样例,如果有什么问题,欢迎留言指正!

数据结构 | C语言实现线性表的顺序和链式结构相关推荐

  1. 数据结构(二)----线性表(List)链式存储结构(1)

    线性表List---链式存储结构 相关概念 链式存储结构/链式表 定义 链式存储特点 单链表 单链表读取 单链表插入 单链表删除 时间复杂度 单链表整表创建 单链表整表删除 顺序存储与链式存储差异 P ...

  2. 线性表的顺序、链式存储结构基本操作

    线性表的抽象数据类型 operation InitList(&L):初始化操作,建立一个空的线性表L ListEmpty(L):若线性表为空,返回true,否则返回false ClearLis ...

  3. 链表list(链式存储结构实现)_数据结构知否知否系列之 — 线性表的顺序与链式存储篇(8000 多字长文)...

    从不浪费时间的人,没有工夫抱怨时间不够. -- 杰弗逊 线性表是由 n 个数据元素组成的有限序列,也是最基本.最简单.最常用的一种数据结构. 作者简介:五月君,Nodejs Developer,热爱技 ...

  4. 数据结构-线性表的顺序、链式存储结构

  5. c语言线性表库函数大全,数据结构(C语言版)-线性表习题详解

    <数据结构(C语言版)-线性表习题详解>由会员分享,可在线阅读,更多相关<数据结构(C语言版)-线性表习题详解(23页珍藏版)>请在人人文库网上搜索. 1.数 据 结 构 ,线 ...

  6. 数据结构之线性表——(二、链式存储结构)[c语言]

    数据结构之线性表--(二.链式存储结构-单链表) 链式存储结构以及基本运算的实现 背景:由于线性表的存储特点是用物理上的相邻实现逻辑上的相邻,他要求用连续的存储单元顺序存储线性表中的各个元素,所以,对 ...

  7. 线性链表java实现_线性表的Java实现--链式存储(双向链表)

    线性表的Java实现--链式存储(双向链表) 有了单向链表的基础,双向链表的实现就容易多了. ? 双向链表的一般情况: ? ? class="decoded" alt=" ...

  8. C语言实现线性表之顺序表

    线性表的抽象数据类型 ADT 线性表(LIST) DATA 线性表的数据集合为{a1,...an},每个元素类型均为DataType, 其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素, ...

  9. c语言建立线性表(顺序储存,链式储存,循环,双向)全

    c语言建立线性表 顺序储存 储存结构 初始化(建立)顺序表 查找操作 一.按值查找,找到返回对应的下标 二.按照下标返回元素 插入操作 一.在线性表尾部添加元素 二.在位置i处插入元素 三.顺序表(有 ...

最新文章

  1. 用tcpdump查看端口包
  2. 安卓怎么连接服务器的数据库文件,安卓怎么连接服务器的数据库文件
  3. 洛谷 P1255 数楼梯 70
  4. C语言基础排序算法-选择排序
  5. NLP之情感分析:基于python编程(jieba库)实现中文文本情感分析(得到的是情感评分)之全部代码
  6. Android--视频播放器
  7. 机器学习 文本分类 代码_无需担心机器学习-如何在少于10行代码中对文本进行分类
  8. 如何理解 Objective-C Delegate
  9. 一个form 如何做两次提交_如何做一个调酒师
  10. 或许是比力扣 leetcode 更好的选择?推荐两个编程算法宝藏网站
  11. vscode的sftp插件同步失败no such file的问题
  12. skynet 学习笔记-netpack模块(1)
  13. 广告化开发(基础知识)~广告效果指标CTR/CVR/ROI/ARPU的理解
  14. 统计分析 -- t分布
  15. WGS84转GCj02
  16. 向云再出发:如数据般飞驰的内蒙古
  17. error和exception区别,throw和throws
  18. 对京东云鼎的学习笔记
  19. python判断手机号运营商_基于python的-使用正则表达式验证手机号并匹配运营商和所述地域...
  20. 电脑快捷修改计算机名

热门文章

  1. 我所经历的汶川大地震之二
  2. 《我的成长》半月刊2009年第2期(总第2期)[4月上]
  3. L3-015 球队“食物链” (30 分)
  4. 天线学习笔记——串馈网络设计
  5. 微信扫码登陆(JAVA)
  6. 无薪加班的第三天,我去公司打了卡
  7. pdf编辑器免安装版_墙裂推荐!功能强大的PDF编辑器最新免安装版!
  8. 20 - Slider组件案例 相亲APP
  9. Servlet注解和可插拔性(第八篇)
  10. 【译】JavaScript中的Promises