关闭

线性表的顺序存储设计和实现 - API函数实现

标签: 线性表链表顺序存储API
707人阅读 评论(0) 收藏 举报
分类:

基本概念


设计与实现

插入元素算法

判断线性表是否合法

判断插入位置是否合法

把最后一个元素到插入位置的元素后移一个位置

将新元素插入

线性表长度加1

获取元素操作

判断线性表是否合法

判断位置是否合法

直接通过数组下标的方式获取元素

删除元素算法

判断线性表是否合法

判断删除位置是否合法

将元素取出

将删除位置后的元素分别向前移动一个位置

线性表长度减1


代码:

</pre><pre name="code" class="cpp">// seqlist.h
#ifndef  __MY_SEQLIST_H__ 
#define __MY_SEQLIST_H__

typedef void SeqList;
typedef void SeqListNode;

//链表 创建
SeqList* SeqList_Create(int capacity);

//链表 销毁
void SeqList_Destroy(SeqList* list);

////链表 清空
void SeqList_Clear(SeqList* list);

//链表 长度
int SeqList_Length(SeqList* list);


//链表 容量 
int SeqList_Capacity(SeqList* list);

//链表 在某一个位置 插入元素
int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);

//获取某一个位置的链表结点
SeqListNode* SeqList_Get(SeqList* list, int pos);

//删除某一个位置的结点
SeqListNode* SeqList_Delete(SeqList* list, int pos);


#endif  //__MY_SEQLIST_H__

// seqList.cpp
#include <iostream>
#include <cstdio>
#include "seqlist.h"

using namespace std;

typedef struct _tag_SeqList
{
	int capacity;
	int length;
	int **node;
}TSeqList;

//链表 创建
SeqList* SeqList_Create(int capacity)
{
	int ret = -1;
	TSeqList *tmp = NULL;
	tmp = (TSeqList *)malloc(sizeof(TSeqList));
	if (tmp == NULL) {
		ret = 1;
		printf("function SeqList_Create() err:%d\n", ret);
		return NULL;
	}
	memset(tmp, 0, sizeof(TSeqList));
	tmp->capacity = capacity;
	tmp->length = 0;
	tmp->node = (int **)malloc(sizeof(void *) * capacity);
	if (tmp->node == NULL) {
		ret = 2;
		printf("function SeqList_Create() err:%d\n", ret);
		return NULL;
	}
	memset(tmp->node, 0, sizeof(void *) * capacity);

	return tmp;
}

//链表 创建
int SeqList_Create2(int capacity, SeqList**handle)
{
	int			ret = 0;
	TSeqList	*tmp = NULL;
	tmp = (TSeqList *)malloc(sizeof(TSeqList));
	if (tmp == NULL)
	{
		ret = 1;
		printf("func SeqList_Create2() err :%d \n", ret);
		return ret;
	}
	memset(tmp, 0, sizeof(TSeqList));
	tmp->capacity = capacity;
	tmp->length = 0;
	tmp->node = (int **)malloc(sizeof(void *) * capacity);
	if (tmp->node == NULL)
	{
		ret = 2;
		printf("func SeqList_Create2() malloc err :%d \n", ret);
		return ret;
	}

	*handle = tmp;
	return ret;
}

//链表 销毁
void SeqList_Destroy(SeqList* list)
{
	if (list == NULL) {
		return;
	}

	TSeqList *tmp = (TSeqList *)list;
	if (tmp->node != NULL) {
		free(tmp->node);
	}
	free(tmp);

	return;
}

////链表 清空
void SeqList_Clear(SeqList* list)
{
	if (list == NULL) {
		return;
	}

	TSeqList *tmp = (TSeqList *)list;
	tmp->length = 0;
	memset(tmp->node, 0, sizeof(tmp->node));

	return;
}

//链表 长度
int SeqList_Length(SeqList* list)
{
	if (list == NULL) {
		return -1;
	}

	TSeqList *tmp = (TSeqList *)list;
	return tmp->length;
}

//链表 容量 
int SeqList_Capacity(SeqList* list)
{
	if (list == NULL) {
		return -1;
	}

	TSeqList *tmp = (TSeqList *)list;
	return tmp->capacity;
}

//链表 在某一个位置 插入元素
int SeqList_Insert(SeqList* list, SeqListNode* node, int pos)
{
	if (list == NULL || node == NULL || pos < 0) {
		return -1;
	}

	TSeqList *tList = (TSeqList *)list;

	// 如果满了
	if (tList->length >= tList->capacity) {
		return -2;
	}

	// 如果pos的位置超出了length,即中间空了一些位置
	if (pos > tList->length) {
		pos = tList->length;
	}

	for (int i = tList->length; i > pos; --i) {
		tList->node[i] = tList->node[i - 1];
	}
	tList->node[pos] = (int *)node;
	++tList->length;

	return 0;
}

//获取某一个位置的链表结点
SeqListNode* SeqList_Get(SeqList* list, int pos)
{
	TSeqList *tList = (TSeqList *)list;
	if (list == NULL || pos < 0 || pos >= tList->length)
	{
		return NULL;
	}

	SeqListNode *tListNode = NULL;
	tListNode = (int *)tList->node[pos];

	return tListNode;
}

//删除某一个位置的结点
SeqListNode* SeqList_Delete(SeqList* list, int pos)
{
	TSeqList *tList = (TSeqList *)list;
	SeqListNode *tListNode = NULL;
	if (list == NULL || pos < 0 || pos >= tList->length) {
		return NULL;
	}

	tListNode = tList->node[pos];
	for (int i = pos + 1; i < tList->length; ++i) {
		tList->node[i - 1] = tList->node[i];
	}
	--tList->length; // 别忘了长度减一

	return tListNode;
}

// main.cpp
#include <iostream>
#include <cstdio>
#include "seqlist.h"

using namespace std;

struct Student
{
	char name[32];
	int age;
};

int main()
{
	Student s1, s2, s3;
	s1.age = 21;
	s2.age = 22;
	s3.age = 23;

	int ret = 0;
	SeqList *list;

	list = SeqList_Create(10);

	ret = SeqList_Insert(list, (SeqListNode *)&s1, 0); // 头插法
	ret = SeqList_Insert(list, (SeqListNode *)&s2, 0); // 头插法
	ret = SeqList_Insert(list, (SeqListNode *)&s3, 0); // 头插法

	// 遍历链表
	for (int i = 0; i < SeqList_Length(list); ++i) {
		Student *tmp = (Student *)SeqList_Get(list, i);
		if (tmp == NULL) {
			printf("function SeqList_Get() err: %d\n", ret);
			return 0;
		}
		printf("age:%d\n", tmp->age);
	}

	// 销毁链表
	while (SeqList_Length(list)) {
		Student *tmp = (Student *)SeqList_Delete(list, 0);
		if (tmp == NULL) {
			printf("function SeqList_Delete() err: %d\n", ret);
			return 0;
		}
		printf("age:%d\n", tmp->age);
	}

	SeqList_Destroy(list);

	return 0;
}

优点:

无需为线性表中的逻辑关系增加额外的空间

可以快速的获取表中合法位置的元素

缺点:

插入和删除操作需要移动大量元素

当线性表长度变化较大时难以确定存储空间的容量


代码详情:Github

1
0
查看评论

线性表顺序存储-使用c语言实现

/*线性表功能的实现*/ #include<stdio.h>//定义常量 存储空间的初始化分配 #define MAXSIZE 20 #define TRUE 1 #define ERROR -1 #define FALSE 0 #define OK 1//用typedef定义类型 ty...
  • u010187139
  • u010187139
  • 2015-06-27 11:24
  • 3092

线性表顺序存储设计与实现_api函数实现

传智扫地僧课程学习笔记。
  • qq_18973645
  • qq_18973645
  • 2017-01-20 13:54
  • 153

线性表——顺序存储(C语言版,附带源代码)

顺序表存储结构容易实现随机存取线性表的第i个数据元素的操作。      但是在实现插入,删除的操作时需要移动大量的数据元素,所以它适用于数据相对稳定的线性表。  /* c2-1.h 线性表的动态分配顺序存储结构 */  #define ...
  • my_Wade
  • my_Wade
  • 2015-06-29 20:23
  • 1664

python线性表顺序存储结构,删除元素

L=[1,2,3,4,5,7,8] def delete_list(L,i): L_lenght = len(L) if iL_lenght: return false if i<L_lenght: del L[i] for k in range(i+1,L_lenght-1...
  • nothing_ZERO
  • nothing_ZERO
  • 2017-02-24 19:32
  • 347

线性表链式存储设计与实现 - API实现

基本概念 链式存储定义 为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息。 表头结点 链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息 数据结点 链表中代表数据元素的结点,包含指向下...
  • zyq522376829
  • zyq522376829
  • 2015-07-11 20:44
  • 592

数据结构_线性表_顺序/链式存储优缺点比较

数据结构_线性表_顺序/链式存储优缺点比较
  • admin_maxin
  • admin_maxin
  • 2016-12-26 23:35
  • 1381

天梯赛训练2 5-4 最长连续递增子序列 (20分)

给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。 输入格式: 输入第1行给出正整数nnn(≤105\le 10^5≤10​5​​);第2行给出nnn个整数,其间以空格分隔。 ...
  • xiaoshulinlove
  • xiaoshulinlove
  • 2016-07-11 23:50
  • 1023

习题3.4 最长连续递增子序列

习题3.4 最长连续递增子序列(20 分) 给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。 输入格式: 输入第1行给出正整数n(≤10​5​​);第2行给...
  • JYL1159131237
  • JYL1159131237
  • 2017-09-16 11:31
  • 373

线性表的顺序存储结构和实现

头文件 head.h#include #include #include /* malloc()等 */ #include /* INT_MAX等 */ #include /* EOF(=^Z或F6),NULL */ #include /* atoi() */ #include /* eof() *...
  • qianqin_2014
  • qianqin_2014
  • 2016-03-31 11:22
  • 806

顺序存储结构插入与删除

插入操作插入算法的思路: 如果插入位置不合理,抛出异常; 如果线性表长度大于等于数组的长度,则抛出异常或动态增加容量; 从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置; 将要插入的元素填入位置i处; 表长度加1; 返回TRUE。实现代码如下: /*初始条件:顺序线性表L已存在,...
  • haandxc
  • haandxc
  • 2016-03-24 08:32
  • 612
    个人资料
    • 访问:424009次
    • 积分:8210
    • 等级:
    • 排名:第2965名
    • 原创:401篇
    • 转载:30篇
    • 译文:11篇
    • 评论:87条
    博客专栏