当前位置: 首页 > news >正文

(C++)数据结构初阶(顺序表的实现)

顺序表的概念

        顺序表是数据结构中一种基础的线性存储结构,它用一段连续的内存空间依次存储数据元素,逻辑上相邻的元素在物理内存中也相邻。概念这部分就简单介绍下,重点是顺序表的实现方法

顺序表的实现方法

定义一个动态的顺序表结构

//定义动态顺序表结构
typedef int SLDataType;
typedef struct SeqList {SLDataType* arr;//指向动态数组分配的指针int capacity;  //空间大小int size;  //有效数据个数
}SL;//typedef struct SeqList SL;

初始化动态顺序表(SeqList.h)

初始化·1

//初始化数据
void SLInit(SL* ps);
//销毁数据
void SLDataTroy(SL* ps);

初始化·2

//插入数据
//尾插
void SLPushBack(SL* ps, SLDataType x);
//头插
void SLPushFront(SL* ps, SLDataType x);////判断空间是否足够
//void SLCheckCapacity(SL* ps);//打印数据
void SLPrint(SL* ps);

初始化·3

//删除数据
//尾删
void SLPopBack(SL* ps);
//头删
void SLPopFront(SL* ps);

初始化·4

//指定位置插入数据
void SLInsert(SL* ps, SLDataType x, int pos);
//删除指定位置数据
void SLErase(SL* ps, int pos);
//查找数据
int SLFind(SL* ps, SLDataType x);

实现动态顺序表的函数方法(SeqList.cpp)

方法一

//初始化
void SLInit(SL* ps) {ps->arr = NULL;//指针指向空,初始不分配内存ps->size = ps->capacity = 0;
}
//销毁
void SLDataTroy(SL* ps) {if (ps->arr) {//判断是否有分配内存(即是否等于空)free(ps->arr);//释放动态分配的数组内存}ps->arr = NULL;// 避免野指针ps->size = ps->capacity = 0;
}

方法二

//判断空间是否足够
void SLCheckCapacity(SL* ps) {//判断空间是否充足if (ps->size == ps->capacity) {//增容(初始容量为0,则为4,否则翻倍)int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//重新分配内存,这里注意,申请内存空间时要使用reallocSLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));//处理内存分配失败if (tmp == NULL) {perror("realloc fail");//打印错误信息exit(1);//退出}//更新指针和容量ps->arr = tmp;ps->capacity *= newCapacity;}
}//插入数据
//尾插(直接在size位置插入)
void SLPushBack(SL* ps, SLDataType x) {//断言assert(ps);////数据不为空//if (ps == NULL) {//	return;//}SLCheckCapacity(ps);//检查空间是否足够ps->arr[ps->size++] = x;
}
//头插(数据整体后移一位)
void SLPushFront(SL* ps, SLDataType x) {assert(ps);//断言SLCheckCapacity(ps);//检查空间是否足够//数据整体后移一位for (int i = ps->size; i > 0; --i) {ps->arr[i] = ps->arr[i - 1];//方法}//下标为0的位置空出来了//更新元素以及个数ps->arr[0] = x;ps->size++;
}//打印数据
void SLPrint(SL* ps) {for (int i = 0; i < ps->size; ++i) {printf("%d ", ps->arr[i]);}printf("\n");
}

方法三

//删除数据
//尾删(直接在size位置进行删除)
void SLPopBack(SL* ps) {assert(ps);//断言assert(ps->size > 0);//非NULLps->arr[ps->size - 1] = -1;//方法ps->size--;
}
//头删(数据整体向前移动一位)
void SLPopFront(SL* ps) {assert(ps);//断言assert(ps->size>0);//非NULL//数据整体向前移动一位for (int i = 0; i < ps->size - 1; ++i) {ps->arr[i] = ps->arr[i + 1];//方法}ps->size--;
}

方法四

//指定位置插入数据
void SLInsert(SL* ps, SLDataType x, int pos) {assert(ps);//断言//在指定范围[0,size]插入数据,确保不越界assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);//检查空间是否足够//pos及之后的数据整体向后移动一位for (int i = ps->size; i > pos; --i) {ps->arr[i] = ps->arr[i - 1];//方法}//更新元素即个数ps->arr[pos] = x;ps->size++;
}
//删除指定位置数据
void SLErase(SL* ps, int pos) {assert(ps);//断言//在指定范围[0,size]插入数据,确保不越界assert(pos >= 0 && pos < ps->size);SLCheckCapacity(ps);//检查空间是否足够//顺序表不能为空//pos之后的数据整体向前移动一位for (int i = pos; i < ps->size-1; ++i) {ps->arr[i] = ps->arr[i + 1];//方法}ps->size--;
}
//查找数据
int SLFind(SL* ps, SLDataType x) {assert(ps);//断言for (int i = 0; i < ps->size; ++i) {if (ps->arr[i] == x) {//条件return i;}}//如果没有找到return -1;
}

测试动态顺序表的函数方法

        这里不重要,你们只需要知道怎么做就可以了!!!

#include"SeqList.h"
#include"STAP.h"
//#include"SeqList.cpp""void SLtest01() {SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);/*SLPushFront(&s, 1);SLPushFront(&s, 2);SLPushFront(&s, 3);SLPushFront(&s, 4);*//*SLPopBack(&s);SLPrint(&s);SLPopBack(&s);SLPrint(&s);SLPopBack(&s);SLPrint(&s);SLPopBack(&s);SLPrint(&s);*//*SLPopBack(&s);SLPrint(&s);*//*SLPopFront(&s);SLPrint(&s);SLPopFront(&s);SLPrint(&s);*//*SLInsert(&s,5,0);SLPrint(&s);*//*SLErase(&s, 3);SLPrint(&s);*/int find = SLFind(&s, 2);if (find < 0) {printf("没有数据");}else {printf("找到了");}SLDataTroy(&s);
}void SLtest02() {printf("\n");//std::vector<int> nums[] = { 3,2,2,3,4,5,3 };///*int numSize = sizeof(nums) / sizeof(nums[0]);*///int n = nums.size();//int val = 3;//int newSize = RemoveElement(nums, /*numSize,*/n, val);//printf("%d %d", val, newSize);//for (int i = 0; i < newSize; ++i) {//	printf("%d", nums[i]);//}std::vector<int> nums = { 3,2,2,3,4,5 };int val = 3;int newSize = RemoveElement(nums, val);/*cout << val << " " << newSize << endl;*/cout << val << "\n";cout << newSize << "\n";for (int i = 0; i < newSize; ++i) {cout << nums[i] << " ";}
}void SLtest03() {printf("\n");vector<int> nums = { 1,1,2,2,3,4,4,5 };int n = nums.size();int newSize = removeDuplicates(nums, n);for (int i = 0; i < n; ++i) {cout << nums[i] << " ";}/*cout << "\n";*/
}//void SLtest04() {
//	vector<int> nums1 = { 1,2,3,0,0,0 };
//	int m = 3;
//	vector<int> nums2 = { 2,5,6 };
//	int n = 3;
//
//	/*merge(nums1, m, nums2, n);*/
//
//	cde(nums1, m, nums2, n);
//
//	for (int num : nums1) {
//		cout << num << "\n";
//	}
//}int main() {//顺序表/*SLtest01();*///顺序表算法题:移除元素SLtest02();//顺序表算法题:删除有序数组中的重复项SLtest03();//顺序表算法题:合并两个有序数组/*SLtest03();*/return 0;
}

动态顺序表的三个拓展算法题

顺序表算法题:移除元素

题目描述

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。返回 k。

题目解析

思路:双指针算法(两个指针)
定义两个指针变量,指向数组第一个位置,
判断nums[src]是否等于val,如果相等,src++
如果不相等 nums[dst]=nums[src],src++,dst++;

时间复杂度:O(n)
空间复杂度:O(1)

解题代码

//算法:双指针算法//int RemoveElement(int* nums, int numSize, int val) {
//	int src = 0, dst = 0;
//	while (src < numSize) {
//		if (nums[src] == val) {
//			src++;
//		}
//		else {
//			nums[dst++] = nums[src++];
//		}
//	}
//	return dst;
//}int RemoveElement(vector<int>& nums, int val) {int n = nums.size();int l = 0, r = 0;while (r < n) {if (nums[r] == val) {++r;}else {nums[l++] = nums[r++];}}return l;
}

顺序表算法题:删除有序数组中的重复项

题目描述

        给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

        更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。返回 k 。
判题标准:

        系统会用下面的代码来测试你的题解:

        int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案

        int k = removeDuplicates(nums); // 调用

        assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
assert nums[i] == expectedNums[i];
}
如果所有断言都通过,那么您的题解将被 通过。

示例 1:

输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,
并且原数组 nums 的前两个元素被修改为 1, 2 。
不需要考虑数组中超出新长度后面的元素。


示例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 ,
并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。
不需要考虑数组中超出新长度后面的元素。


提示:

1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums 已按 非严格递增 排列

题目解析

//思路:定义两个指针,dst指向第一个位置,src指向下一个位置,判断src和dst的位置
//如果相等:src++
//如果不相等:dst++,nums[dst]=nums[src],src++

题目代码

//class Solution {
//public:
//    int removeDuplicates(vector<int>& nums,int numSize) {
//        int dst = 0, src = dst + 1;
//        while (src < numSize) {
//            if (nums[dst] != nums[src]) {
//                dst++;
//                nums[dst] = nums[src];
//            }
//            src++;
//        }
//        return dst + 1;
//    }
//};int removeDuplicates(vector<int>& nums, int numSize) {int dst = 0, src = dst + 1;while (src < numSize) {if (nums[dst] != nums[src]) {dst++;nums[dst] = nums[src];}src++;}return dst + 1;
}

顺序表算法题:合并两个有序数组

题目描述

        给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,
分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

        注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。


示例 2:

输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果是 [1] 。


示例 3:

输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。


注意,因为 m = 0 ,所以 nums1 中没有元素。
nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。


提示:

nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
-109 <= nums1[i], nums2[j] <= 109


进阶:你可以设计实现一个时间复杂度为 O(m + n) 的算法解决此问题吗?

题目代码

void cde(vector<int>& nums1, int m, vector<int>& nums2, int n) {int l1 = m - 1;int l2 = n - 1;int l3 = m + n - 1;while (l1 >= 0 || l2 >= 0) {if (nums1[l1] > nums2[l2]) {nums1[l3--] = nums1[l1--];}else {nums1[l3--] = nums2[l2--];}}while (l2 > 0) {nums1[l3--] = nums1[l2--];}
}

拓展

SeqList.h

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<vector>
#include<algorithm>
#include<assert.h>
using namespace std;//定义动态顺序表结构
typedef int SLDataType;
typedef struct SeqList {SLDataType* arr;//指向动态数组分配的指针int capacity;  //空间大小int size;  //有效数据个数
}SL;//typedef struct SeqList SL;//初始化数据
void SLInit(SL* ps);
//销毁数据
void SLDataTroy(SL* ps);
//插入数据
//尾插
void SLPushBack(SL* ps, SLDataType x);
//头插
void SLPushFront(SL* ps, SLDataType x);////判断空间是否足够
//void SLCheckCapacity(SL* ps);//打印数据
void SLPrint(SL* ps);//删除数据
//尾删
void SLPopBack(SL* ps);
//头删
void SLPopFront(SL* ps);//指定位置插入数据
void SLInsert(SL* ps, SLDataType x, int pos);
//删除指定位置数据
void SLErase(SL* ps, int pos);
//查找数据
int SLFind(SL* ps, SLDataType x);

SeqList.cpp

#define _CRT_SECURE_NO_WARNINGS  1
#pragma warning(disable:6031)
#include"SeqList.h"
//初始化
void SLInit(SL* ps) {ps->arr = NULL;//指针指向空,初始不分配内存ps->size = ps->capacity = 0;
}
//销毁
void SLDataTroy(SL* ps) {if (ps->arr) {//判断是否有分配内存(即是否等于空)free(ps->arr);//释放动态分配的数组内存}ps->arr = NULL;// 避免野指针ps->size = ps->capacity = 0;
}//判断空间是否足够
void SLCheckCapacity(SL* ps) {//判断空间是否充足if (ps->size == ps->capacity) {//增容(初始容量为0,则为4,否则翻倍)int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//重新分配内存,这里注意,申请内存空间时要使用reallocSLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));//处理内存分配失败if (tmp == NULL) {perror("realloc fail");//打印错误信息exit(1);//退出}//更新指针和容量ps->arr = tmp;ps->capacity *= newCapacity;}
}//插入数据
//尾插(直接在size位置插入)
void SLPushBack(SL* ps, SLDataType x) {//断言assert(ps);////数据不为空//if (ps == NULL) {//	return;//}SLCheckCapacity(ps);//检查空间是否足够ps->arr[ps->size++] = x;
}
//头插(数据整体后移一位)
void SLPushFront(SL* ps, SLDataType x) {assert(ps);//断言SLCheckCapacity(ps);//检查空间是否足够//数据整体后移一位for (int i = ps->size; i > 0; --i) {ps->arr[i] = ps->arr[i - 1];//方法}//下标为0的位置空出来了//更新元素以及个数ps->arr[0] = x;ps->size++;
}//打印数据
void SLPrint(SL* ps) {for (int i = 0; i < ps->size; ++i) {printf("%d ", ps->arr[i]);}printf("\n");
}//删除数据
//尾删(直接在size位置进行删除)
void SLPopBack(SL* ps) {assert(ps);//断言assert(ps->size > 0);//非NULLps->arr[ps->size - 1] = -1;//方法ps->size--;
}
//头删(数据整体向前移动一位)
void SLPopFront(SL* ps) {assert(ps);//断言assert(ps->size>0);//非NULL//数据整体向前移动一位for (int i = 0; i < ps->size - 1; ++i) {ps->arr[i] = ps->arr[i + 1];//方法}ps->size--;
}//指定位置插入数据
void SLInsert(SL* ps, SLDataType x, int pos) {assert(ps);//断言//在指定范围[0,size]插入数据,确保不越界assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);//检查空间是否足够//pos及之后的数据整体向后移动一位for (int i = ps->size; i > pos; --i) {ps->arr[i] = ps->arr[i - 1];//方法}//更新元素即个数ps->arr[pos] = x;ps->size++;
}
//删除指定位置数据
void SLErase(SL* ps, int pos) {assert(ps);//断言//在指定范围[0,size]插入数据,确保不越界assert(pos >= 0 && pos < ps->size);SLCheckCapacity(ps);//检查空间是否足够//顺序表不能为空//pos之后的数据整体向前移动一位for (int i = pos; i < ps->size-1; ++i) {ps->arr[i] = ps->arr[i + 1];//方法}ps->size--;
}
//查找数据
int SLFind(SL* ps, SLDataType x) {assert(ps);//断言for (int i = 0; i < ps->size; ++i) {if (ps->arr[i] == x) {//条件return i;}}//如果没有找到return -1;
}

STAP.h

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<vector>
#include<algorithm>
#include<assert.h>
using namespace std;//移除元素
//int RemoveElement(int* nums,int newSize, int val);// 函数声明
int RemoveElement(std::vector<int>& nums, int val);////删除有序数组中的重复项
//int removeDuplicates(vector<int>& nums, int numSize)int removeDuplicates(vector<int>& nums, int numSize);

T_ele.cpp

#define _CRT_SECURE_NO_WARNINGS  1
#pragma warning(disable:6031)
#include"STAP.h"//顺序表算法题:移除元素/*
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。
元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。
nums 的其余元素和 nums 的大小并不重要。
返回 k。
*//*
思路:双指针算法(两个指针)
定义两个指针变量,指向数组第一个位置,
判断nums[src]是否等于val,如果相等,src++
如果不相等 nums[dst]=nums[src],src++,dst++;时间复杂度:O(n)
空间复杂度:O(1)*///算法:双指针算法//int RemoveElement(int* nums, int numSize, int val) {
//	int src = 0, dst = 0;
//	while (src < numSize) {
//		if (nums[src] == val) {
//			src++;
//		}
//		else {
//			nums[dst++] = nums[src++];
//		}
//	}
//	return dst;
//}int RemoveElement(vector<int>& nums, int val) {int n = nums.size();int l = 0, r = 0;while (r < n) {if (nums[r] == val) {++r;}else {nums[l++] = nums[r++];}}return l;
}

R_doa.cpp

#define _CRT_SECURE_NO_WARNINGS  1
#pragma warning(disable:6031)#include"STAP.h"//顺序表算法题:删除有序数组中的重复项/*
给你一个 非严格递增排列 的数组 nums ,
请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,
返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k ,
你需要做以下事情确保你的题解可以被通过:更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,
并按照它们最初在 nums 中出现的顺序排列。
nums 的其余元素与 nums 的大小不重要。返回 k 。
判题标准:系统会用下面的代码来测试你的题解:int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案int k = removeDuplicates(nums); // 调用assert k == expectedNums.length;
for (int i = 0; i < k; i++) {assert nums[i] == expectedNums[i];
}
如果所有断言都通过,那么您的题解将被 通过。示例 1:输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,
并且原数组 nums 的前两个元素被修改为 1, 2 。
不需要考虑数组中超出新长度后面的元素。
示例 2:输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 ,
并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。
不需要考虑数组中超出新长度后面的元素。提示:1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums 已按 非严格递增 排列
*///思路:定义两个指针,dst指向第一个位置,src指向下一个位置,判断src和dst的位置
//如果相等:src++
//如果不相等:dst++,nums[dst]=nums[src],src++//class Solution {
//public:
//    int removeDuplicates(vector<int>& nums,int numSize) {
//        int dst = 0, src = dst + 1;
//        while (src < numSize) {
//            if (nums[dst] != nums[src]) {
//                dst++;
//                nums[dst] = nums[src];
//            }
//            src++;
//        }
//        return dst + 1;
//    }
//};int removeDuplicates(vector<int>& nums, int numSize) {int dst = 0, src = dst + 1;while (src < numSize) {if (nums[dst] != nums[src]) {dst++;nums[dst] = nums[src];}src++;}return dst + 1;
}

M_arrays.cpp

#define _CRT_SECURE_NO_WARNINGS  1
#pragma warning(disable:6031)
#include"STAP.h"//顺序表算法题:合并两个有序数组/*
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,
分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。
为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,
后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。示例 1:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
示例 2:输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果是 [1] 。
示例 3:输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意,因为 m = 0 ,所以 nums1 中没有元素。
nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。提示:nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
-109 <= nums1[i], nums2[j] <= 109进阶:你可以设计实现一个时间复杂度为 O(m + n) 的算法解决此问题吗?
*/void cde(vector<int>& nums1, int m, vector<int>& nums2, int n) {int l1 = m - 1;int l2 = n - 1;int l3 = m + n - 1;while (l1 >= 0 || l2 >= 0) {if (nums1[l1] > nums2[l2]) {nums1[l3--] = nums1[l1--];}else {nums1[l3--] = nums2[l2--];}}while (l2 > 0) {nums1[l3--] = nums1[l2--];}
}

test.cpp

#define _CRT_SECURE_NO_WARNINGS  1
#pragma warning(disable:6031)
#include"SeqList.h"
#include"STAP.h"
//#include"SeqList.cpp""void SLtest01() {SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);/*SLPushFront(&s, 1);SLPushFront(&s, 2);SLPushFront(&s, 3);SLPushFront(&s, 4);*//*SLPopBack(&s);SLPrint(&s);SLPopBack(&s);SLPrint(&s);SLPopBack(&s);SLPrint(&s);SLPopBack(&s);SLPrint(&s);*//*SLPopBack(&s);SLPrint(&s);*//*SLPopFront(&s);SLPrint(&s);SLPopFront(&s);SLPrint(&s);*//*SLInsert(&s,5,0);SLPrint(&s);*//*SLErase(&s, 3);SLPrint(&s);*/int find = SLFind(&s, 2);if (find < 0) {printf("没有数据");}else {printf("找到了");}SLDataTroy(&s);
}void SLtest02() {printf("\n");//std::vector<int> nums[] = { 3,2,2,3,4,5,3 };///*int numSize = sizeof(nums) / sizeof(nums[0]);*///int n = nums.size();//int val = 3;//int newSize = RemoveElement(nums, /*numSize,*/n, val);//printf("%d %d", val, newSize);//for (int i = 0; i < newSize; ++i) {//	printf("%d", nums[i]);//}std::vector<int> nums = { 3,2,2,3,4,5 };int val = 3;int newSize = RemoveElement(nums, val);/*cout << val << " " << newSize << endl;*/cout << val << "\n";cout << newSize << "\n";for (int i = 0; i < newSize; ++i) {cout << nums[i] << " ";}
}void SLtest03() {printf("\n");vector<int> nums = { 1,1,2,2,3,4,4,5 };int n = nums.size();int newSize = removeDuplicates(nums, n);for (int i = 0; i < n; ++i) {cout << nums[i] << " ";}/*cout << "\n";*/
}//void SLtest04() {
//	vector<int> nums1 = { 1,2,3,0,0,0 };
//	int m = 3;
//	vector<int> nums2 = { 2,5,6 };
//	int n = 3;
//
//	/*merge(nums1, m, nums2, n);*/
//
//	cde(nums1, m, nums2, n);
//
//	for (int num : nums1) {
//		cout << num << "\n";
//	}
//}int main() {//顺序表/*SLtest01();*///顺序表算法题:移除元素SLtest02();//顺序表算法题:删除有序数组中的重复项SLtest03();//顺序表算法题:合并两个有序数组/*SLtest03();*/return 0;
}


文章转载自:

http://ubD0sz6K.xswrb.cn
http://WwtbZkS9.xswrb.cn
http://L5uWq5jt.xswrb.cn
http://ixWqdEhb.xswrb.cn
http://cpsi6VUA.xswrb.cn
http://FtWxeNwM.xswrb.cn
http://sREKx4Ul.xswrb.cn
http://ElDHbAeK.xswrb.cn
http://uDktjiGP.xswrb.cn
http://9RLoedmz.xswrb.cn
http://5TgCVSbR.xswrb.cn
http://PjMfqJ0u.xswrb.cn
http://e8rzPZEv.xswrb.cn
http://TG960s3B.xswrb.cn
http://BKLp7lz4.xswrb.cn
http://DTp7k7ys.xswrb.cn
http://Rr8a0uuU.xswrb.cn
http://C1HFUa5E.xswrb.cn
http://VS4rjgj0.xswrb.cn
http://MMNn6Ntk.xswrb.cn
http://mH9LTaEI.xswrb.cn
http://NnpZtZgq.xswrb.cn
http://Gr6BgyvN.xswrb.cn
http://XCK8O8Rt.xswrb.cn
http://hulL2jnI.xswrb.cn
http://0cg6O1Xe.xswrb.cn
http://n1946Rch.xswrb.cn
http://LjWHOoHi.xswrb.cn
http://HTgzb7rG.xswrb.cn
http://TK4HEcWX.xswrb.cn
http://www.dtcms.com/a/375241.html

相关文章:

  • 一手实测,文心x1.1的升级很惊喜啊
  • 【系统分析师】第18章-关键技术:移动应用系统分析与设计(核心总结)
  • echarts 实现柱状图自动滚动展示数据(Vue3)
  • 基于Python的购物商城网站电商管理系统【2026最新】
  • Electron 分发策略:创建安装程序与自动更新
  • IAR 集成开发环境入门指南:字体设置与调试实战
  • CentOS7下Ceph集群部署实战
  • 逆元,除法同余,容斥原理笔记
  • 【springboot+vue】党员党建活动管理平台(源码+文档+调试+基础修改+答疑)
  • JAVA 面试 MySQL
  • 【Pandas】3.2-数据预处理:行的基本操作
  • 【展厅多媒体】 AI人工智能赋能虚拟数字展厅应用与制作
  • Python入门教程之逻辑运算符
  • 构建AI智能体:二十八、大语言模型BERT:原理、应用结合日常场景实践全面解析
  • pytest并发测试,资源问题导致用例失败解决办法
  • 【openEuler 24.03 LTS SP2】真实实验部署ollama0.11.6+deepseekR1:1.5b+open-webUI
  • 欢迎来到“个人产品化”时代
  • 【论文阅读】REFRAG:一个提升RAG解码效率的新思路
  • 云原生监控系统 Prometheus大总结 20250909
  • Python解释器安装配置教程(Windows)
  • Java爬虫获取京东item_get_app数据的实战指南
  • HashMap(JDK1.7到1.8的过渡)
  • 趣味学RUST基础篇(函数式编程迭代器)
  • 抗ASIC、抗GPU 的密码哈希算法(安全密钥派生)Argon2算法
  • Nginx 实战系列(六)—— Nginx 性能优化与防盗链配置指南
  • 深入解析 Apache Flink Checkpoint 与 Savepoint 原理与最佳实践
  • C#WPF控制USB摄像头参数:曝光、白平衡等高级设置完全指南
  • 第2节-过滤表中的行-IN
  • 2025年渗透测试面试题总结-60(题目+回答)
  • 【GD32】ROM Bootloader、自定义Bootloader区别