目录
线性表—顺序表
问题引入:
线性表
定义
若干数据元素的一个线性序列。
特征
- 表头元素没前驱
- 表尾元素无后继
- 其他元素有且仅有一个直接前驱和直接后继。
顺序存储结构的表示
将线性表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
}