静态顺序表的基本操作
#pragma once
#define MAX_SIZE 10
typedef unsigned int size_t;
typedef int DataType;
#include<stdio.h>
#include<assert.h>
#include<memory.h>
#include <stdlib.h>
#define MAX 100
typedef struct SeqList
{
DataType arr[MAX];
int sz; // 順序表中有效元素的個(gè)數(shù)
}SeqList, *pSeqList;
//typedef struct SeqList SeqList;
///
// .h
// 初始化順序表
void InitSeq(pSeqList pSeq)//初始化順序表
{
assert(pSeq);
memset(pSeq->arr, 0, sizeof(DataType)*MAX);
pSeq->sz = 0;
}
// 尾插
void PushBack(pSeqList pSeq, DataType x)//尾插
{
assert(pSeq);
if (pSeq->sz == MAX)
{
printf("順序表已滿\n");
exit(EXIT_FAILURE);
}
pSeq->arr[pSeq->sz] = x;
++pSeq->sz;
}
// 尾刪
void PopBack(pSeqList pSeq)//尾刪
{
assert(pSeq);
if (pSeq->sz == 0)
{
printf("順序表沒有元素;不可刪除\n");
exit(EXIT_FAILURE);
}
--pSeq->sz;
}
// 頭插
void PushFront(pSeqList pSeq, DataType x)//頭插
{
int i = 0;
assert(pSeq);
if (pSeq->sz == MAX)
{
printf("順序表已滿\n");
exit(EXIT_FAILURE);
}
for (i = pSeq->sz; i>0; --i)
{
pSeq->arr[i] = pSeq->arr[i - 1];
}
pSeq->arr[0] = x;
++pSeq->sz;
}
// 頭刪
void PopFront(pSeqList pSeq)//頭刪
{
int i = 0;
assert(pSeq);
if (pSeq->sz == 0)
{
printf("順序表沒有元素;不可刪除\n");
exit(EXIT_FAILURE);
}
for (i = 0; i<pSeq->sz - 1; ++i)
{
pSeq->arr[i] = pSeq->arr[i + 1];
}
--pSeq->sz;
}
// 任意位置中插入值為data的元素
void Insert(pSeqList pSeq, int pos, DataType x)//在順序表某位置插入某個(gè)特定元素
{
int i = 0;
assert(pSeq);
if (pSeq->sz == MAX)
{
printf("順序表已滿\n");
exit(EXIT_FAILURE);
}
if (pos >= MAX)
{
printf("插入位置不合適\n");
exit(EXIT_FAILURE);
}
for (i = pSeq->sz; i>pos; --i)
{
pSeq->arr[i] = pSeq->arr[i - 1];
}
pSeq->arr[pos] = x;
++pSeq->sz;
}
// 刪除任意位置中的元素
void SeqListErase(pSeqList pSeq, int pos)
{
int i = 0;
assert(pSeq);
if (Empty(pSeq))
{
printf("順序表為空\n");
return;
}
if (pos < 0 || pos >= pSeq->sz)
{
printf("%d 位置非法\n");
return;
}
for (i = pos; i < pSeq->sz - 1; i++)
{
pSeq->arr[i] = pSeq->arr[i + 1];
}
pSeq->sz--;
}
// 在順序表中查找值為data的元素,返回該元素在順序表中的下標(biāo)
//int SeqListFind(pSeqList ps, DataType data);
int SeqListFind(pSeqList pSeq, int value)
{
assert(pSeq);
size_t i = 0;
for (i = 0; i < pSeq->sz; i++)
{
if (pSeq->arr[i] == value)
{
return i;//返回?cái)?shù)組下標(biāo)
}
}
return -1;
}
// 刪除順序表中值為data的元素
void Remove(pSeqList pSeq, DataType data)
{
int i = 0;
int j = 0;
assert(pSeq);
if (pSeq->sz == 0)
{
printf("順序表為空;不可刪除\n");
exit(EXIT_FAILURE);
}
for (i = 0; i < (pSeq->sz); ++i)
{
if (pSeq->arr[i] == data)
{
for (j = i; j<pSeq->sz - 1; ++j)
{
pSeq->arr[j] = pSeq->arr[j + 1];
}
--pSeq->sz;
break;
}
}
return;
}
// 刪除順序表中所有值為data的元素
void RemoveAll(pSeqList pSeq, DataType x)
{
int i = 0;
int j = 0;
assert(pSeq);
if (pSeq->sz == 0)
{
printf("順序表沒有元素;不可刪除\n");
exit(EXIT_FAILURE);
}
for (i = 0; i<pSeq->sz; ++i)
{
if (pSeq->arr[i] == x)
{
for (j = i; j<pSeq->sz - 1; ++j)
{
pSeq->arr[j] = pSeq->arr[j + 1];
}
--pSeq->sz;//記得--元素個(gè)數(shù);要不然上增循環(huán)會(huì)越界;
/*刪除元素以后(后面覆蓋前面),記得將下標(biāo)回到前一位置;
再次進(jìn)入循環(huán),i會(huì)走到剛才的位置;現(xiàn)在是新的元素;這樣可以
避免漏檢查元素,可以有效刪除出相連相同的元素;*/
i = i - 1;
}
}
return;
}
// 判斷順序表是否為空
int SeqListEmpty(SeqList* seqlist)//返回該順序表是否為空,為空返回1,否則返回0
{
if (seqlist == NULL) {
return;
}
if (seqlist->sz == 0) {
return 1;
}
else
return 0;
}
// 獲取順序表中元素的個(gè)數(shù)
size_t SeqListSize(SeqList* seqlist)//返回該順序表的個(gè)數(shù)
{
if (seqlist == NULL) {
return;
}
return seqlist->sz;
}
/
// 輔助操作
// 打印順序表中的元素
void Print(SeqList *seq)
{
assert(seq);
size_t i = 0;
for (i = 0; i < seq->sz; i++)
{
printf("%d->", seq->arr[i]);
}
}
// 用冒泡排序?qū)樞虮碇械脑剡M(jìn)行排序
void SeqListBubbleSort(SeqList* seqlist)//冒泡排序
{
if (seqlist == NULL) {
return;
}
if (seqlist->sz == 1) {
return;
}
int i = 0;
for (i = 0; i<seqlist->sz - 1; i++) {
int j = 0;
for (j = 0; j<seqlist->sz - 1 - i; j++) {
if (seqlist->arr[j]>seqlist->arr[j + 1]) {
DataType tmp = seqlist->arr[j];
seqlist->arr[j] = seqlist->arr[j + 1];
seqlist->arr[j + 1] = tmp;
}
}
}
}
// 用選擇排序?qū)樞虮碇械脑剡M(jìn)行排序
void SelectSort(int* arr, int sz);
void SelectSort(SeqList *seq)
{
assert(seq);
size_t i = 0;
size_t j = 0;
for (i = 0; i < seq->sz; i++)
{
size_t min = i;
for (j = i + 1; j < seq->sz; j++)//找到每次最小值
{
if (seq->arr[min] > seq->arr[j])
{
min = j;
}
}
if (i != min)
{
/*DataType t = seq->data[min];
seq->data[min] = seq->data[i];
seq->data[i] = t;*/
seq->arr[min] ^= seq->arr[i];
seq->arr[i] ^= seq->arr[min];
seq->arr[min] ^= seq->arr[i];
}
}
}
// 選擇排序優(yōu)化---一次找出最大最小元素所在的位置
void SelectSort_OP(int* arr, int sz);
轉(zhuǎn)載于:https://www.cnblogs.com/lx1997/p/8641755.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的静态顺序表的基本操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像配准系列之基于FFD形变与LM算法的
- 下一篇: 内存申请与一级二级指针