动态顺序表
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#define InitSize 10
#define NULLVal INT_MIN;
typedef int ElemType;
typedef struct {
ElemType *data;
int length;
int MaxSize;
}SqList;
bool InitList(SqList& L) {
L.data = (ElemType*)malloc(sizeof(ElemType) * InitSize);
if (L.data == NULL) {
return false;
}
L.length = 0;
L.MaxSize = InitSize;
return true;
}
void IncreaseSize(SqList& L, int len) {
ElemType* p = L.data;
L.data = (ElemType *)malloc(sizeof(ElemType) * (InitSize+len));
for (int i = 0; i < L.length; i++) {
L.data[i] = p[i];
}
L.MaxSize = L.MaxSize + len;
free(p);
}
bool ListInsert(SqList& L, int i, ElemType e) {
if (i <= 0 || i > L.length + 1) {
return false;
}
if (L.length >= L.MaxSize) {
return false;
}
for (int j = L.length; j >= i; j--) {
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
L.length++;
return true;
}
bool ListDelete(SqList& L, int i, ElemType& e) {
if (i <= 0 || i > L.length) {
return false;
}
e = L.data[i - 1];
for (int j = i; j < L.length; j++) {
L.data[j - 1] = L.data[j];
}
L.data[L.length - 1] = 0;
L.length--;
return true;
}
ElemType GetElem(SqList L, int i) {
if (i <= 0 || i > L.length) {
return NULLVal;
}
return L.data[i - 1];
}
int LocateElem(SqList L, int e) {
for (int i = 0; i < L.length; i++) {
if (L.data[i] == e) {
return i + 1;
}
}
return 0;
}
bool ListEmpty(SqList L) {
return L.length == 0;
}
bool ListCreate(SqList& L) {
int n;
printf("请输入创建数据的个数:");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
ElemType e;
printf("请输入第%d个数据:", i);
scanf("%d", &e);
bool b = ListInsert(L, i, e);
if (b == false)
printf("插入失败\n");
}
return true;
}
void PrintList(SqList L) {
for (int i = 0; i < L.length; i++) {
printf("%5d", L.data[i]);
}
printf("\n");
}
bool DestroyList(SqList& L) {
free(L.data);
L.length = 0;
L.MaxSize = 0;
return true;
}
int main() {
SqList L;
InitList(L);
ListCreate(L);
printf("%d\n", L.length);
int i = LocateElem(L, 5);
printf("查找的数字位置是%d\n", i);
ElemType e = GetElem(L, 3);
printf("查找的位置数字是%d\n", e);
ListDelete(L, 1, e);
printf("删除的值是%d,删除后的长度为%d\n", e, L.length);
PrintList(L);
DestroyList(L);
if (ListEmpty(L) == true) {
printf("顺序表为空\n");
}
else {
printf("顺序表不为空\n");
}
return 0;
}
静态顺序表
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define NULLVal INT_MIN;
#define MaxSize 100
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int length;
int maxsize;
}SqList;
bool InitList(SqList& L) {
for (int i = 0; i < MaxSize; i++) {
L.data[i] = 0;
}
L.length = 0;
L.maxsize = MaxSize;
return true;
}
bool ListInsert(SqList& L, int i, ElemType e) {
if (i <= 0 || i > L.length+1) {
return false;
}
if (L.length >= MaxSize) {
return false;
}
for (int j = L.length; j >= i; j--) {
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
L.length++;
return true;
}
bool ListDelete(SqList& L, int i, ElemType& e) {
if (i <= 0 || i > L.length) {
return false;
}
e = L.data[i - 1];
for (int j = i; j < L.length; j++) {
L.data[j-1] = L.data[j];
}
L.data[L.length - 1] = 0;
L.length--;
return true;
}
ElemType GetElem(SqList L, int i) {
if (i <= 0 || i > L.length) {
return NULLVal;
}
return L.data[i - 1];
}
int LocateElem(SqList L, int e) {
for (int i = 0; i < L.length; i++) {
if (L.data[i] == e) {
return i+1;
}
}
return 0;
}
bool ListEmpty(SqList L) {
return L.length == 0;
}
bool ListCreate(SqList& L) {
int n;
printf("请输入创建数据的个数:");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
ElemType e;
printf("请输入第%d个数据:", i);
scanf("%d", &e);
bool b = ListInsert(L, i, e);
if (b == false)
printf("插入失败\n");
}
return true;
}
void PrintList(SqList L) {
for (int i = 0; i < L.length; i++) {
printf("%5d", L.data[i]);
}
printf("\n");
}
提升
bool Del_Min(SqList &L, ElemType& e) {
if (L.length == 0) {
return false;
}
e = L.data[0];
int pos = 0;
for (int i = 1; i < L.length; i++) {
if (L.data[i] < e) {
e = L.data[i];
pos = i;
}
}
L.data[pos] = L.data[L.length - 1];
L.length--;
return true;
}
void Reverse(SqList& L) {
for (int i = 0; i < L.length/2; i++) {
ElemType temp = L.data[i];
L.data[i] = L.data[L.length - i - 1];
L.data[L.length - i - 1] = temp;
}
}
void Del_x_1(SqList& L, ElemType x) {
int k = 0;
for (int i = 0; i < L.length; i++) {
if (L.data[i] == x) {
k++;
}
else {
L.data[i - k] = L.data[i];
}
}
L.length -= k;
}
void Del_x_2(SqList& L, ElemType x) {
int k = 0;
for (int i = 0; i < L.length; i++) {
if (L.data[i] != x) {
L.data[k] = L.data[i];
k++;
}
}
L.length = k;
}
bool Del_s_t1(SqList& L, ElemType s, ElemType t) {
if (s >= t || L.length == 0) {
return false;
}
int k = 0;
for (int i = 0; i < L.length; i++) {
if (L.data[i] < s|| L.data[i] > t) {
L.data[k] = L.data[i];
k++;
}
}
L.length = k;
return true;
}
bool Del_s_t2(SqList& L, ElemType s, ElemType t) {
if (s >= t || L.length == 0) {
return false;
}
int i = 0;
for (; i < L.length && s > L.data[i]; i++);
if (i >= L.length) {
return false;
}
int j = i;
for (; j < L.length && t >= L.data[j]; j++);
for (; j < L.length; i++, j++) {
L.data[i] = L.data[j];
}
L.length = i;
return true;
}
bool Del_Same(SqList& L) {
if (L.length == 0) {
return false;
}
int k = 0;
for (int i = 1; i < L.length; i++) {
if (L.data[i] != L.data[k]) {
L.data[++k] = L.data[i];
}
}
L.length = k+1;
return true;
}
bool Merge(SqList L1, SqList L2, SqList& L3) {
if (L1.length + L2.length > L3.maxsize) {
return false;
}
int i = 0, j = 0, k = 0;
while (i < L1.length || j < L2.length) {
if (i >= L1.length) {
L3.data[k++] = L2.data[j++];
}
else if (j >= L1.length) {
L3.data[k++] = L2.data[i++];
}
else if (L1.data[i] <= L2.data[j]) {
L3.data[k++] = L1.data[i++];
}
else {
L3.data[k++] = L2.data[j++];
}
}
L3.length = k;
return true;
}
void reverse(SqList& L, int left, int right) {
while (left < right) {
ElemType temp = L.data[left];
L.data[left] = L.data[right];
L.data[right] = temp;
left++;
right--;
}
}
void Exchange(SqList& L, int m, int n) {
if (m<0||n<0||m + n > L.length) {
return;
}
reverse(L, 0, m + n - 1);
reverse(L, 0, m - 1);
reverse(L, m, m + n - 1);
}
void SearchExchangeInsert(SqList& L, ElemType x) {
int left = 0, right = L.length - 1, mid;
while (left <= right) {
mid = (left + right) / 2;
if (L.data[mid] == x) {
break;
}
else if (L.data[mid] < x) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
if (mid!=L.length-1&&L.data[mid] == x) {
ElemType temp = L.data[mid];
L.data[mid] = L.data[mid + 1];
L.data[mid + 1] = temp;
}
if(left>right){
for (int i = L.length; i > right; i--) {
L.data[i] = L.data[i - 1];
}
L.data[mid] = x;
L.length++;
}
}
int findMissMin(int A[], int n) {
int *B = (int *)malloc(sizeof(int) * n);
memset(B, 0, sizeof(int) * n);
for (int i = 0; i < n; i++) {
if (A[i] >= 1 && A[i] <= n) {
B[A[i]-1] = 1;
}
}
int i;
for (i = 0; i < n; i++) {
if (B[i] == 0)
break;
}
return i+1;
}
int findMainElem(int A[], int n){
int *hash = (int *)malloc(sizeof(int)*n);
for(int i = 0; i < n; i++){
hash[i] = 0;
}
for(int i = 0; i < n; i++){
hash[A[i]]++;
if(hash[A[i]] > n/2){
return A[i];
}
}
return -1;
}
int findMainElem(int A[], int n){
int count = 0, mainElem;
for(int i = 0; i < n; i++){
if(count==0 || mainElem == A[i]){
mainElem = A[i];
count++;
}else{
count--;
}
}
if(count == 0){
return -1;
}
count = 0;
for(int i = 0; i < n; i++){
if(A[i] == mainElem){
count++;
}
}
if(count >n/2){
return mainElem;
}else{
return -1;
}
}
int main() {
SqList L;
InitList(L);
ListCreate(L);
printf("%d\n", L.length);
for (int i = 0; i < 5; i++) {
ElemType x;
printf("输入插入的数据:");
scanf("%d", &x);
SearchExchangeInsert(L, x);
PrintList(L);
printf("长度%d\n", L.length);
}
return 0;
}