[数据结构笔记] 1. 顺序表 内含所有函数C语言代码,完全无伪代码
线性表
由 n(n>=0) 个数据特性相同的元素构成的有限序列,称为线性表。
顺序表
用一组连续的内存单元依次存储线性表的各个元素,也就是说,逻辑上相邻的元素,实际的物理存储空间也是连续的。
直接写数组存储
类型定义
#define MAXSIZE 100
typedef int ElemType;//给数据类型起别名
typedef struct {
ElemType data[MAXSIZE];//直接开数组表示顺序表
int length;
}SeqList;
初始化
void initList(SeqList* L)
{
L->length = 0;
}
增
尾插法即在尾部添加元素
- 令
data[i]
处的值为e length++
int appendElem(SeqList*L , ElemType e)
{
if (L->length >= MAXSIZE)
{
printf("顺序表已满\n");
return 0;
}
L->data[L->length] = e;
L->length++;
return 1;
}
遍历
写一个遍历数组的循环,输出语句写为输出i
地址对应的值
void listElem(SeqList *L)
{
for (int i = 0; i < L->length; i++)
{
printf("%d ",L->data[i]);//输出L上i位置对应的值
}
printf("\n");
}
插入元素
判断是否能插入(是否满, 是否插入在顺序表前(顺序表外))判断根据需求来, 可以增加程序的鲁棒性- 遍历使原来 该位置 以及 该位置之后 的元素后移
- 令 该位置的值 为插入值
length++
int insertElem(SeqList*L, int pos, ElemType e)
{
/*
if (L->length >= MAXSIZE)
{
printf("表已经满了\n");
return 0;
}
if (pos < 1 || pos > L->length)
{
printf("插入位置错误\n");
return 0;
}
*/
if (pos <= L->length)
{
//pos-1 是因为说要插在第五个元素位置时, 实际上插在下标为4的位置上
for (int i = L->length - 1; i >= pos - 1; i--)
{
L->data[i + 1] = L->data[i];
}
L->data[pos - 1] = e;
L->length++;
}
return 1;
}
删除元素
- 如果删除的不是最后一位元素,将该位之后的所有元素依次前移, 覆盖该元素的值
length--
int deleteElem(SeqList* L, int pos, ElemType* e)
{
//第一行是将 要删除的值保存在第三个参数中, 如果有需要可以打印被删除的值
*e = L->data[pos - 1];//若不需要保存可以删去本行和上面的第三个参数,两个参数即可
if (pos < L->length)
{
for (int i = pos; i < L->length; i++)
{
L->data[i - 1] = L->data[i];
}
}
L->length--;
return 1;
}
查找元素
遍历顺序表, 如果找到则返回该元素位置(下标+1), 找不到则返回0
int findElem(SeqList*L, ElemType e)
{
for (int i = 0; i < L->length; i++)
{
if (L->data[i] == e)
{
return i + 1;
}
}
return 0;
}
以上声明和函数对应的main函数
int main(int argc, char const* argv[])
{
//声明一个线性表并初始化
//SeqList list;
//initList(&list);
printf("初始化成功,目前长度占用 %d\n",list.length);
printf("目前占用内存 %zu字节\n", sizeof(list.data));
appendElem(&list, 88);
appendElem(&list, 45);
appendElem(&list, 43);
appendElem(&list, 17);
listElem(&list);//遍历
//插入元素
//insertElem(&list, 2, 18);
//listElem(&list);//遍历
//删除元素
//ElemType delData;
//deleteElem(&list, 2, &delData);
//printf("被删除的数据为:%d\n", delData);
//listElem(&list);
//查找元素
printf("%d\n", findElem(&list,43));
return 0;
}
动态分配内存地址初始化
new的底层代码?
以上函数完全不用修改,只是修改初始化
main
函数中 &
删除, .
改为->
//动态分配内存实现
typedef struct {
ElemType* data;
int length;
}SeqList;
SeqList* initList()
{
SeqList *L= (SeqList*)malloc(sizeof(SeqList));
L->data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
L->length = 0;
return L;
}
故新的main函数:
int main(int argc, char const* argv[])
{
//动态分配内存
SeqList* list = initList();
printf("初始化成功,目前长度占用 %d\n",list->length);
printf("目前占用内存 %zu字节\n", sizeof(list->data));
appendElem(list, 88);
appendElem(list, 45);
appendElem(list, 43);
appendElem(list, 17);
listElem(list);//遍历
//插入元素
//insertElem(list, 2, 18);
//listElem(list);//遍历
//删除元素
//ElemType delData;
//deleteElem(list, 2, delData);
//printf("被删除的数据为:%d\n", delData);
//listElem(list);
printf("%d\n", findElem(list,43));
return 0;
}
全部代码
#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef int ElemType;//给数据类型起别名
//非动态分配内存实现
//typedef struct {
// ElemType data[MAXSIZE];//直接开数组表示顺序表
// int length;
//}SeqList;
//
//void initList(SeqList* L)
//{
// L->length = 0;
//}
//动态分配内存实现
typedef struct {
ElemType* data;
int length;
}SeqList;
SeqList* initList()
{
SeqList *L= (SeqList*)malloc(sizeof(SeqList));
L->data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
L->length = 0;
return L;
}
//尾插
int appendElem(SeqList*L , ElemType e)
{
if (L->length >= MAXSIZE)
{
printf("顺序表已满\n");
return 0;
}
L->data[L->length] = e;
L->length++;
return 1;
}
void listElem(SeqList *L)
{
for (int i = 0; i < L->length; i++)
{
printf("%d ",L->data[i]);
}
printf("\n");
}
int insertElem(SeqList*L, int pos, ElemType e)
{
if (L->length >= MAXSIZE)
{
printf("表已经满了\n");
return 0;
}
if (pos < 1 || pos > L->length)
{
printf("插入位置错误\n");
return 0;
}
if (pos <= L->length)
{
for (int i = L->length - 1; i >= pos - 1; i--)//pos-1 是因为说要插在第五个元素位置时, 实际上插在下标为4的位置上
{
L->data[i + 1] = L->data[i];
}
L->data[pos - 1] = e;
L->length++;
}
return 1;
}
int deleteElem(SeqList* L, int pos, ElemType* e)
{
*e = L->data[pos - 1];
if (pos < L->length)
{
for (int i = pos; i < L->length; i++)
{
L->data[i - 1] = L->data[i];
}
}
L->length--;
return 1;
}
int findElem(SeqList*L, ElemType e)
{
if (L->length == 0)
{
printf("空链表\n");
return 0;
}
for (int i = 0; i < L->length; i++)
{
if (L->data[i] == e)
{
return i + 1;
}
}
return 0;
}
int main(int argc, char const* argv[])
{
//声明一个线性表并初始化
//SeqList list;
//initList(&list);
//动态分配内存
SeqList* list = initList();
printf("初始化成功,目前长度占用 %d\n",list->length);
printf("目前占用内存 %zu字节\n", sizeof(list->data));
appendElem(list, 88);
appendElem(list, 45);
appendElem(list, 43);
appendElem(list, 17);
listElem(list);//遍历
//插入元素
//insertElem(list, 2, 18);
//listElem(list);//遍历
//删除元素
//ElemType delData;
//deleteElem(list, 2, delData);
//printf("被删除的数据为:%d\n", delData);
//listElem(list);
printf("%d\n", findElem(list,43));
return 0;
}