DAY 2 - 3 : 线性表 — 顺序存储

目录

线性表—顺序表

线性表

        定义

         特征

顺序存储结构的表示

        特征 

        顺序表的实现

        建立一个空表

        置空表

        判断是否为空 

        插入

        删除

        定位

        释放 

         测试


线性表—顺序表

        问题引入:

线性表

        定义

        若干数据元素的一个线性序列。

         特征

  •         表头元素没前驱
  •         表尾元素无后继
  •         其他元素有且仅有一个直接前驱和直接后继。

顺序存储结构的表示

        将线性表L=(a0,a1, ……,an-1)中的各元素依次存储于计算机一片连续的存储空间。

        特征 

                优点

  •         逻辑相邻的元素ai,ai+1,存储位置也相邻。
  •         对数据元素ai的存取为随机存取或按地址存取。
  •         存储密度高。

                缺点

  •         对表的插入和删除等运算的时间复杂度较差。比如:假设在文章开始阶段的图书管理系统002位置插入一本书,那么后面所有书本都需要向下移动一个格。

        顺序表的实现

//sqlist.h
#define N 128
typedef int data_t;

typedef struct
{
	data_t data[N];
	int last;
}sqlist, * sqlink;

        设线性表 L=(a0,a1, ……,an-1),对 L的基本运算有:

        建立一个空表

        整体思路
                1.malloc。
                2.初始化。
                3.返回线性表的地址。

link list_create()
{
	link p = malloc(sizeof(list));
	if (p == NULL)
	{
		return NULL;
	}
	memset(p, 0 , sizeof(*p));
	p->last = -1;
	return p;
}
        置空表
int list_empty(link p)
{
	if (p == NULL)
	{
		return -1;
	}
	memset(p, 0, sizeof(*p));
	p->last = -1;
	return 0;
}
        判断是否为空 
int list_empty(link p)
{
	if (p->last == -1)
	{
		return 1;
	}
	return 0;
}
        插入

        整体思路:
                1.检查线性表是否是满
                2.pos[0,last]
                3.从后往前移动
                4.赋值
                5.last+1

int list_insert(link p,char s[], int pos)
{
	/*检查空指针、列表是否已满、位置有效性*/
	if (p == NULL || p->last == M - 1||pos < 0 || pos > p->last + 1)
	{
		return -1;
	}
	int i = 0;
	for (i = p->last;i >= pos;i--)
	{
		strcpy(p->booklist[i + 1], p->booklist[i]);
	}
	strcpy(p->booklist[pos], s);
	p->last++;
	return 0;
}
        删除

        整体思路:

                1.检查pos是否在范围中[0,last]

                2.MOV往前面移

                3.last--

//sqlist.h
int list_del(sqlink L,int pos)
//sqlist.c
int list_del(sqlink L, int pos)
{
	if (L == NULL)
	{
		return -1;
	}
	if (L->last == -1)
	{
		printf("列表空!\n");
		return -1;
	}
	if (pos < 0 || pos > L->last)
	{
		printf("无效地址!\n");
		return -1;
	}
	for (int i = pos + 1; i <= L->last; i++)
	{
		L->data[i-1] = L->data[i];
	}
	L->last--;
	return 0;
}
        定位
int list_loc(link p, char s[])
{
	int i = 0;
	while (i <= p->last)
	{
		if (strcmp(p->booklist[i],s)==0)
		{
			return i;
		}
		i++;
	}
	return -1;
}
        释放 
int list_free(link p)
{
	if (p != NULL)
	{
		free(p);
		p = NULL;
	}
	return 0;
}
         测试
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"list.h"
#define insert	//插入功能
#define del		//删除功能
#define loc		//查找功能
void test1();
int main()
{
	test1();
	return 0;
}
void test1()
{
	link p = list_create();
	char s[] = "C Prime Plus";
	char s1[] = "C & CPP";
	char s2[] = "C & C++";
	char s3[] = "C与指针";
	char s4[] = "数据结构";
	list_insert(p, s,  0);
	list_insert(p, s1, 1);
	list_insert(p, s2, 2);
	list_insert(p, s3, 3);
	list_insert(p, s4, 4);
	list_show(p);
	putchar('\n');
#ifdef insert

	char s5[] = "stm32";
	char s6[] = "RTOS";
	char s7[] = "模拟电路";
	list_insert(p, s5, 1);
	list_insert(p, s6, 2);
	list_insert(p, s7, 3);
	list_show(p);
	putchar('\n');
#endif
#ifdef del
	list_del(p, 1);
	list_show(p);
	putchar('\n');
#endif 
#ifdef loc
	printf("%s in %d\n",s3,list_loc(p, s3));
#endif 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值