数据结构02:线性表(c语言完整描述)

本文介绍了线性表的顺序存储结构——顺序表,包括其定义、基本操作,并通过C语言展示了顺序表的动态和静态分配实现。顺序表允许随机访问但插入和删除操作可能涉及大量元素移动。此外,还涵盖了单链表、双链表、循环链表和静态链表的基本概念和操作。
摘要由CSDN通过智能技术生成

线性表

顺序表即线性表的顺序存储,它是用一组地址连续的存储单元依次存储顺序表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。

线性表的定义和基本操作

  1. 定义
  2. 基本操作

线性表的顺序表示

  1. 顺序表的定义
  2. 顺序表的操作

线性表的链式表示

  1. 单链表的定义

  2. 单链表的操作

  3. 双链表的操作

  4. 循环链表的操作

  5. 静态链表的操作

  6. 逆置问题

  7. 逻辑顺序与物理顺序相同

  8. 随机访问

  9. 每个结点只存储数据元素

  10. 插入、删除操作需要移动大量元素

c语言描述(静态分配)

测试

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

#define MaxSize 50

typedef struct
{
	int data[MaxSize];
	int length;
}SqList;

SqList* InitList();		//构造一个顺序表
int Length(SqList *L);		//顺序表长度
int LocateElem(SqList *L, int e);		//返回L中元素e的位置
int GetElem(SqList *L, int i);		//返回L中第i位置元素值
bool ListInsert(SqList *L, int i, int e);		//在L中第i个位置插入元素e
bool ListDelete(SqList *L, int i);		//删除L中第i个位置上元素 
void PrintList(SqList *L);		//输出L所有元素
void DestroyList(SqList *L);		//释放L所占空间 

int main()		//测试函数是否可行
{
	SqList *L;		//指针较为方便
	L = InitList();
	int i;
	for(i=0;i<55;i+=11)
	{
		ListInsert(L, 1, 99-i);
	}
	printf("当前表的长度为%d\n",Length(L));
	PrintList(L);
	ListDelete(L, 2);
	PrintList(L);
	int e = L->data[2];
	printf("\n%d的位置是%d",e,LocateElem(L,e));
	printf("\n第%d个元素为%d\n",2,GetElem(L,2)); 
	DestroyList(L);
	printf("当前表的长度为%d\n",Length(L));
	PrintList(L); 
	return 0;
}

SqList* InitList()		//返回指向SqList类型的指针
{
	SqList *L;
	L = (SqList *)(malloc(sizeof(SqList)));		//申请空间并返回指针赋值
	L->length = 0;
	return L;
};

int Length(SqList *L)
{
	return L->length;
}

int LocateElem(SqList *L, int e)	//平均比较次数为(n+1)/2
{
	int i;
	for(i=0; i<L->length; i++)
	{
		if(L->data[i] == e)	
			return i+1;
	}
	return 0;
}

int GetElem(SqList *L, int i)		//O(1)
{
	return L->data[i-1];
}

bool ListInsert(SqList *L, int i, int e)		//平均移动次数为n/2
{
	int j;
	if(i<1 || i>L->length+1){
		printf("插入位置不合法\n");
		return false;
	}
	if(L->length >= MaxSize){
		printf("存储空间已满\n");
		return false;
	}
	for(j=L->length; j>=i; j--)
	{
		L->data[j] = L->data[j-1];		//第i个元素及后面后移一个位置
	}
	L->data[i-1] = e;
	L->length++;
	printf("%d已被插入\n",e);
	return true;
}

bool ListDelete(SqList *L, int i)		//平均删除次数为(n-1)/2
{
	int j;
	if(i<1 || i>L->length){
		printf("删除位置不合法\n");
		return false;
	}
	printf("\n%d已被删除\n",L->data[i-1]);
	for(j=i; j<=L->length; j++)
	{
		L->data[j-1] = L->data[j];		//第i+1个元素及后面前移一个位置
	}
	L->length--;
	return true;
}

void PrintList(SqList *L)
{
	int i;
	printf("当前表中元素为 "); 
	for(i=0; i<L->length; i++)
		printf("%d ",L->data[i]);
}

void DestroyList(SqList *L)
{
	printf("表已清空\n");
	L->length = 0;
	free(L);	//释放L所指空间内存
} 

c语言描述(动态分配)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值