线性表的顺序和链式存储

顺序

cpp 复制代码
#include<iostream>
#define MaxSize 50
using namespace std;
typedef int elemType;
//初始化线性表
typedef struct
{
	int length;
	elemType date[MaxSize];
}SqList;

//建立顺序表
void CreateList(SqList*& L, elemType a[], int n)
{
	int i = 0, k = 0;
	L =(SqList *) malloc(sizeof(SqList));
	while (i < n)
	{
		L->date[k] = a[i];
		k++, i++;

	}
	L->length = k;
}
//初始化线性表
void InitList(SqList*& L)
{
	L = (SqList*)malloc(sizeof(SqList));
	L->length = 0;

}
//销毁线性表
void DestroyList(SqList*& L)
{
	free(L);
}
//判断线性表是否为空
bool ListEmpty(SqList* L)
{
	return (L->length == 0);
}
//求线性表的长度
int ListLength(SqList* L)
{
	return (L->length);
}
//输出线性表
void DispList(SqList* L)
{
	for (int i = 0; i < L->length; i++)
	{
		cout << L->date[i]<<" ";
	}
}
//按序号求线性表中的元素
bool GetSqList(SqList* L, int i, elemType& e)
{
	if (i<1 || i>L->length)
	{
		return false;
	}
	e = L->date[i - 1];
	return true;

}
//按元素值查找
int LocateSqList(SqList* L, elemType e)
{
	int i = 0;
	for (i = 0; i < L->length; i++)
	{
		if (L->date[i] == e)
		{
			break;
		}
	}
	if (i >= L->length)
		return 0;
	else
		return i + 1;
}
//插入数据元素
bool ListInsert(SqList* L, int i, elemType e)
{
	if (i<1 || i>L->length + 1 || L->length == MaxSize)
	{
		return false;
	}
	i--;
	for (int j = L->length; j > i; j--)
	{
		L->date[j] = L->date[j - 1];
	}
	L->date[i] = e;
	L->length++;
	return true;
}
//删除数据元素
bool ListDelete(SqList* L, int i, elemType & e)
{
	if (i<1 || i>L->length||L->length==0)
	{
		return false;
	}
	i--;
	e = L->date[i];
	for (int j = i; j <L->length-1; j++)
	{
		L->date[j] = L->date[j + 1];
	}
	L->length--;
	return true;
}
int main()
{
	SqList* L;
	int date[10];
	for (int i = 0; i < 10; i++)
	{
		date[i] = i + 1;
	}
	int  n = sizeof(date)/sizeof(date[0]);
	CreateList(L, date, n);
	DispList(L);
	elemType e;
	GetSqList(L, 8, e);

	LocateSqList(L, 8);
	ListInsert(L,4, -1);
	elemType s;
	ListDelete(L, 10, s);
		DispList(L);
	DestroyList(L);
	return 0;
}


//删除所有等于n的元素
void delnode(SqList*& L, int n)
{
	int i = 0;
	for (int k = 0; k < L->length; k++)
	{
		if (L->date[k] != n)
		{
			L->date[i] = L->date[k];
			i++;
		}
	}
	L->length = i;
}

链式

cpp 复制代码
#include<iostream>
using namespace std;
typedef int elemType;
typedef struct LNode
{
	elemType date;
	struct LNode* next;
}LinkNode;
//头插法
void CreateListF(LinkNode*& L, elemType a[], int n)
{
	LinkNode* s;
	L = (LinkNode*)malloc(sizeof(LinkNode));
	L->next = NULL;
	for (int i = 0; i < n; i++)
	{
		s= (LinkNode*)malloc(sizeof(LinkNode));
		s->date = a[i];
		s->next = L->next;
		L->next = s;
	}
}
//尾插法
void CreateListR(LinkNode*& L, elemType a[], int n)
{
	LinkNode* s, * r;//s 负责承载新创建的元素节点,r 负责跟踪链表的尾部位置
	L= (LinkNode*)malloc(sizeof(LinkNode));
	r = L;
	for (int i = 0; i < n; i++)
	{
		s= (LinkNode*)malloc(sizeof(LinkNode));
		s->date = a[i];
		r->next = s;
		r = s;
	}
	r->next = NULL;
}
//初始化线性表
void InitList(LinkNode*& L)
{
	L = (LinkNode*)malloc(sizeof(LinkNode));
	L->next = NULL;
}
//销毁线性表
void DestroyList(LinkNode*& L)
{
	LinkNode* pre = L, * p = L->next;
	while (p != NULL)
	{
		free(pre);
		pre = p;
		p = p->next;
	}
	free(pre);
}
//判断线性表是否为空
bool ListEmpty(LinkNode* L)
{
	return (L->next == NULL);
}
//求线性表的长度
int ListLength(LinkNode*& L)
{
	int n=0;
	LinkNode* p = L;
	while (p->next!= NULL)
	{
		n++;
		p = p->next;
	}
	return (n);
}
//输出线性表
void DispList(LinkNode*& L)
{
	LinkNode* p = L->next;
	while (p != NULL)
	{
		cout << p->date << " ";
		p = p->next;
	}
}
//按序号求线性表中的元素
bool Getelem(LinkNode* L, int i, elemType & e)
{
	int j = 0;
	LinkNode* p = L;
	if (i <= 0)
	{
		return false;
	}
	while (j < i && p != NULL)
	{
		j++;
		p = p->next;
	}
	if (p == NULL)
	{
		return false;
	}
	else
	{
		e = p->date;
		return true;
	}
}
//按元素值查找
int LocateList(LinkNode* L, elemType e)
{
	int i = 1;
	LinkNode* p = L->next;
	while (p != NULL && p->date != e)
	{
		i++;
		p = p->next;
	}
	if (p == NULL)
	{
		return 0;
	}
	else
	{
		return i;
	}
}
//插入数据元素
bool ListInsert(LinkNode*& L, int i, elemType e)
{
	int j = 0;
	LinkNode* p = L,*s;
	if (i <= 0)
	{
		return false;
	}
	while (j < i - 1 && p != NULL)
	{
		j++;
		p = p->next;
	}
	if (p == NULL)
	{
		return false;
	}
	else
	{
		s=(LinkNode*)malloc(sizeof(LinkNode));
		s->date = e;
		s->next = p->next;
		p->next = s;
		return true;
	}
	
}
//删除数据元素
bool ListDelete(LinkNode*& L, int i, elemType& e)
{
	int j = 0;
	LinkNode* p = L, * q;
	if (i <= 0)
	{
		return false;
	}
	while (j < i - 1 && p != NULL)
	{
		j++;
		p = p->next;
	}
	if (p == NULL)
	{
		return false;
	}
	else
	{
		q = p->next;
		if (q == NULL)
		{
			return false;
		}
		e = q->date;
		p->next = q->next;
		free(q);
		return true;
	}
}
相关推荐
m0_6399069421 分钟前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
Sakura_j_h_1 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
ZhengEnCi1 小时前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
程序喵大人2 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
秋天的怀念_David2 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Pniubi2 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hhb_6183 小时前
大模型落地三重优化实战
人工智能·算法·机器学习
云和数据.ChenGuang3 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
jimy14 小时前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++
2601_970703834 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法