嵌入式学习--线性表Day01

顺序表单向链表单向循环链表双向链表双向循环链表顺序栈链式栈循环队列顺序队列)链式队列

1逻辑结构线性结构

2存储结构顺序链式

3特点一对一每一个节点最多有一个前驱和一个后继,首节点无前驱,尾节点无后继

顺序表

特点内存连续数组)

1逻辑结构 线性结构

2存储结构 顺序存储结构

3操作 增删改查

1.1数组插入删除操作

函数名命名规则:

下滑线法:create_empty_seqlist

小驼峰法:createEmptySeqList

大驼峰法:CreateEmptySeqList

练习:

int a[100]={1,2,3,4,5,6,7,8};

//1)向数组的第几个位置插入数据

int *p //保存的数组的首地址

int n//n代表的是数组中有效的元素个数(非数组的长度size 100)8

int post;//位置 代表的是第几个位置,数组元素下标 位置的编号从0开始 position

int data;//插入到数组中的数据

void insertIntoA (int *p,int post,int data,int n)

{

//1.n-1位置post位置数据整体向后移动一位

//2.新数据data赋值post位置

}

//删除数组指定位置的数据

void deleteFromA(int *p, int n, int post)

{

//1.post+1位置----n-1位置所有数据整体向前移动一个位置覆盖删除

}

arr.c

#include <stdio.h>
//1)向数组的第几个位置插入数据
void insertIntoA(int *p, int post, int data, int n)
{
    int i;
    // 1.将n-1位置到post位置的数据整体向后移动一位
    for(i=n-1;i>=post;i--)
        p[i+1]=p[i];
    // 2.将新数据data赋值到post位置
    p[post] = data;
}
// 2)删除数组指定位置的数据
void deleteFromA(int *p, int n, int post)
{
    int i;
    // 1.将post+1位置----》n-1位置所有数据整体向前移动一个位置,覆盖删除
    for(i=post+1;i<=n-1;i++)
        p[i-1]=p[i];
}
//3)遍历输出A
void showA(int *p,int n)
{
    for(int i=0;i<n;i++)
        printf("%d ",p[i]);
    printf("\n");
}

int main(int argc, char const *argv[])
{
    int a[100] = {1, 2, 3, 4, 5, 6, 7, 8};
    showA(a,8);
    insertIntoA(a,2,300,8);
    showA(a,9);
    deleteFromA(a,9,2);
    showA(a,8);
    return 0;
}


1.2修改last版本

#include <stdio.h>
int last = 7;//n-1,最后一个有效元素下标

//1)向数组的第几个位置插入数据
void insertIntoA(int *p, int post, int data)
{
    int i;
    // 1.将last位置到post位置的数据整体向后移动一位
    for(i=last;i>=post;i--)
        p[i+1]=p[i];
    // 2.将新数据data赋值到post位置
    p[post] = data;
    //3. 最后一个有效元素下标+1
    last++;
}
// 2)删除数组指定位置的数据
void deleteFromA(int *p,int post)
{
    int i;
    // 1.将post+1位置----》last位置所有数据整体向前移动一个位置,覆盖删除
    for(i=post+1;i<=last;i++)
        p[i-1]=p[i];
    //2. 最后一个有效元素下标-1
    last--;
}
//3)遍历输出A
void showA(int *p)
{
    for(int i=0;i<=last;i++)
        printf("%d ",p[i]);
    printf("\n");
}

int main(int argc, char const *argv[])
{
    int a[100] = {1, 2, 3, 4, 5, 6, 7, 8};
    showA(a);
    insertIntoA(a,2,300);
    showA(a);
    deleteFromA(a,2);
    showA(a);
    return 0;
}


1.3顺序相关操作

#ifndef _SEQLIST_H__
#define _SEQLIST_H__
#include <stdio.h>
#include <stdlib.h>

#define N 5
typedef struct seq
{
    int data[N];
    int last;
}seqlist_t;

//1.创建一个空的顺序表
seqlist_t *CreateEpSeqlist();//返回的是申请空间的首地址
//2.向顺序表的指定位置插入数据
int InsertIntoSeqlist(seqlist_t *p, int post,int data);//post第几个位置,data插入的数据
//3.遍历顺序表sequence 顺序 list 表
void ShowSeqlist(seqlist_t *p);
//4.判断顺序表是否为满,满返回1 未满返回0
int IsFullSeqlist(seqlist_t *p);
//5.判断顺序表是否为空
int IsEpSeqlist(seqlist_t *p);
//6.删除顺序表中指定位置的数据post删除位置
int DeletePostSeqlist(seqlist_t *p, int post);
//7.清空顺序表
void ClearSeqList(seqlist_t *p);
//8.修改指定位置的数据
int ChangePostSeqList(seqlist_t *p,int post,int data);//post被修改的位置,data修改成的数据
//9.查找指定数据出现的位置
int SearchDataSeqList(seqlist_t *p,int data);//data代表被查找的数据


#endif

在C++中,我们可以创建一个简单的顺序表(数组实现),用于实现上述功能。这里是一个简化的例子: ```cpp #include <iostream> class SequentialList { private: int* data; // 存储数据的指针 int size; // 线性表当前元素个数 int capacity; // 容量 public: SequentialList(int initialCapacity = 5) { data = new int[initialCapacity]; capacity = initialCapacity; size = 0; } ~SequentialList() { // 析构函数,防止内存泄漏 delete[] data; } // 判断线性表是否为空 bool isEmpty() const { return size == 0; } // 求线性表长度 int length() const { return size; } // 获取指定位置的元素 (索引从0开始) int get(int index) const { if (index >= 0 && index < size) { return data[index]; } throw std::out_of_range("Index out of range"); } // 求前驱 (返回值为-1,因为顺序表无前驱节点) int predecessor(int index) const { if (index > 0) { return get(index - 1); } else { return -1; } } // 求后继 (返回值为-1,因为顺序表无后继节点) int successor(int index) const { if (index < size - 1) { return get(index + 1); } else { return -1; } } // 在指定位置插入元素 void insertAt(int index, int value) { if (index < 0 || index > size) { throw std::out_of_range("Invalid insertion index"); } if (size == capacity) { resize(capacity * 2); // 当满时扩大容量 } for (int i = size; i > index; --i) { data[i] = data[i - 1]; } data[index] = value; ++size; } // 删除指定位置的元素 void removeAt(int index) { if (index < 0 || index >= size) { throw std::out_of_range("Invalid removal index"); } for (int i = index; i < size - 1; ++i) { data[i] = data[i + 1]; } --size; } // 显示线性表 void display() const { for (int i = 0; i < size; ++i) { std::cout << "Element at index " << i << ": " << data[i] << " "; } std::cout << "\n"; } // 清空线性表 void clear() { for (int i = 0; i < size; ++i) { data[i] = 0; } size = 0; } // 输入负数退出程序 static void inputExit() { std::cin >> size; if (size < 0) { exit(0); // 使用系统退出,终止程序 } } }; int main() { SequentialList list; list.inputExit(); // 调用各个方法... // ... list.clear(); // 清空线性表 list.display(); // 显示线性表 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值