//
// Created by 86184 on 2024/9/7.
//
//
#include <stdio.h>
#include <stdbool.h>
typedef struct LNode {
int data[128];
int length;
} SqList;
void InitSq(SqList *L) {
for (int i = 0; i < 128; ++i) {
(*L).data[i] = -1;
}
(*L).length = 0;
}
void Insert(SqList *L) {
printf("请输入节点值(输入999结束输入):");
fflush(stdout);
int val, i = 0, len = 0;
scanf("%d", &val);
while (val != 999) {
(*L).data[i++] = val;
len++;
scanf("%d", &val);
}
(*L).length = len;
}
void Printf(SqList L) {
int i = 0;
printf("表长为:%d\n", L.length);
for (i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
}
//t-5. 有序表中删除其重复的值 使表中所有元素均不同
bool DeleteSameVai(SqList *L) {
if ((*L).length == 0) return false;
int i, j;
for (i = 0, j = 1; j < (*L).length; j++) {
if ((*L).data[i] != (*L).data[j]) {
(*L).data[++i] = (*L).data[j];
}
}
(*L).length = i + 1;
return true;
}
//t-3. 对长度为n的顺序表L 编写一个时间复杂度为o(n) 空间复杂度为o(1)的算法 删除顺序表中所有值为x的数据元素
//思路1
void DeleteX1(SqList *L, int x) {
int i, k;
i = k = 0;
for (i = 0; i < (*L).length; i++) {
if ((*L).data[i] == x) {
k++;
} else {
(*L).data[i - k] = (*L).data[i];
}
}
(*L).length = i - k;
}
//思路2
void DeleteX2(SqList *L, int x) {
int i, k;
i = k = 0;
for (i = 0; i < (*L).length; i++) {
if ((*L).data[i] != x) {
(*L).data[k++] = (*L).data[i];
}
}
(*L).length = k;
}
//思路3 TODO
void DeleteX3(SqList *L, int x) {
}
//t-8.线性表{a1 , a2 , a3 , a4 , a5 , ..... , an} 中的元素递增有序
//设计算法花费最少的时间查找数值为x的元素 若找到 则将其与其后继元素位置交换 如果找不到则将其插入表中使元素依旧递增有序
void SearchChangeX(SqList *L, int x) {
int low = 0;
int high = (*L).length - 1;
int mid;
int temp;
while (low <= high) {
// 1 2 2 4
mid = (low + high) / 2; //下取整
if ((*L).data[mid] == x) {
temp = (*L).data[mid + 1];
(*L).data[mid + 1] = (*L).data[mid];
(*L).data[mid] = temp;
return;
} else if ((*L).data[mid] > x) high = mid - 1;
else low = mid + 1;
}
if ((*L).data[mid] != x) {
for (int i = (*L).length; i > high; i--) {
(*L).data[i] = (*L).data[i - 1];
}
(*L).data[low] = x;
(*L).length++;
}
}
//写法2
void SearchChangeX1(SqList *L, int x) {
if (L->length == 0) {
L->data[0] = x;
L->length++;
return;
}
int low = 0;
int high = L->length - 1;
int mid;
while (low <= high) {
mid = (low + high) / 2; // 整数除法
if (L->data[mid] == x) {
// x 已存在于数组中,交换元素
printf("%d\n", L->data[mid]);
if (mid + 1 < L->length) {
int temp = L->data[mid + 1];
L->data[mid + 1] = L->data[mid];
L->data[mid] = temp;
}
return;
} else if (L->data[mid] > x) {
high = mid - 1;
} else {
low = mid + 1;
}
}
printf("Inserting %d\n", x);
// 插入新元素 x
for (int i = L->length; i > low; --i) {
L->data[i] = L->data[i - 1];
}
L->data[low] = x;
L->length++;
}
//相等
// 1 2 3 4
// l h
// 0 1 2 3
//
//不相等
// 1 2 2 4
// l h
// hl
// h l
// 0 1 2 3
//t-9 给定三个序列A B C 长度均为n 且无重复元素递增序列
//设计尽可能高效算法 逐行输出共同元素
int max(int a, int b) {
return (a > b) ? a : b;
}
void CommonData(int A[], int B[], int C[], int n) {
int k = 0, i = 0, j = 0;
printf("相同的元素为:");
fflush(stdout);
while (i < n && j < n && k < n) {
if (A[i] == B[j] && B[j] == C[k]) {
printf("%d ", A[i]);
i++;
j++;
k++;
} else {
int maxValue = max(A[i], max(B[j], C[k]));
if (A[i] < maxValue) i++;
if (B[j] < maxValue) j++;
if (C[k] < maxValue) k++;
}
}
}
int main() {
// SqList L;
// InitSq(&L);
// Insert(&L);
// printf("初始表数据为:\n");
// fflush(stdout);
// Printf(L);
//
// printf("\n");
// printf("删除相同元素后表数据为:\n");
// fflush(stdout);
// DeleteSameVai(&L);
// Printf(L);
// printf("\n");
// scanf("");
// printf("删除顺序表中指定元素:\n");
// fflush(stdout);
// DeleteX2(&L, 3);
// Printf(L);
// printf("\n");
// scanf("");
// printf("交换X元素:\n");
// fflush(stdout);
// SearchChangeX(&L, 3);
// Printf(L);
int n = 4;
int A[4] = {1, 2, 5, 9};
int B[4] = {2, 5, 6, 9};
int C[4] = {1, 2, 5, 9};
CommonData(A, B, C, n);
return 0;
}
链表代码-1
最新推荐文章于 2024-09-16 23:33:58 发布