顺序表 删除指定范围
#include "list.h" // 请不要删除,否则检查不通过
#include
#include
void del_x2y(SeqList* L, ElemType x, ElemType y)
{
int i = 0, j = 0;
for (i = 0; i <= L->last; i++) {
if (L->elem[i] < x || L->elem[i] > y) {
L->elem[j++] = L->elem[i]; //在范围外,则继续赋值
}
}
L->last = j - 1; //储存下标位置
}
顺序表 删除重复
#include "list.h" // 请不要删除,否则检查不通过
#include
#include
void del_dupnum(SeqList* L)
{
int min = L->elem[0];
int tmp = L->elem[0];
for (int i = 1; i <= L->last; i++) {
if (L->elem[i] == tmp)
L->elem[i] = min;
else
tmp = L->elem[i];
}
int p = 1, q = 1;
while (q <= L->last) {
if (L->elem[q] != min) {
L->elem[p] = L->elem[q];
p++;
}
q++;
}
L->last = p - 1;
}
顺序表 数据调整
#include "list.h" // 请不要删除,否则检查不通过
#include
#include
//要求左奇数右偶数
void odd_even(SeqList* L)
{
int* left = &(L->elem[0]);
int* right = &(L->elem[L->last]);
int tmp;
while (left < right) {
//左边是偶数
if (*left % 2 == 0) {
//右边是奇数
if (*right % 2 == 1) {
//交换
tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
} else {
right--;
}
} else {
//左边是奇数
left++;
}
}
}
链表 删除范围内结点
#include "list.h" // 请不要删除,否则检查不通过
#include
#include
void lnk_del_x2y(LinkList L, ElemType mink, ElemType maxk)
{
LinkList left = NULL;
LinkList right = NULL;
LinkList tmp = NULL;
//找到左指针
while (L->next != NULL) {
if ((L->next->data > mink) && (L->next->data < maxk)) {
left = L;
L = L->next;
break;
} else {
L = L->next;
}
}
//找到右指针
while (L->next != NULL) {
if ((L->data > mink) && (L->data < maxk)) {
tmp = L;
L = L->next;
free(tmp);
} else {
right = L;
break;
}
}
if (right == NULL)
return;
left->next = right;
}
链表 倒数查找
#include "list.h" // 请不要删除,否则检查不通过
#include
#include
int lnk_search(LinkList L, int k, ElemType* p_ele)
{
//带计数器遍历链表,得到链表长度
int count = 1;
LinkList tmp = L;
int i = 0;
while (tmp->next != NULL) {
tmp = tmp->next;
count++;
}
tmp = L;
//遍历count-k次链表
if (k > count || k <= 0) {
return 0;
} else {
for (i = 0; i < count - k; i++) {
tmp = tmp->next;
}
*p_ele = tmp->data;
return 1;
}
}
链表 合并
#include "list.h" // 请不要删除,否则检查不通过
#include
#include
void lnk_merge(LinkList A, LinkList B, LinkList C)
{
LinkList tmp = C; //记录最末尾的位置
LinkList tmpA = A->next;
LinkList tmpB = B->next;
while (1) {
if (tmpA == NULL) {
return C;
} else {
tmp->next = tmpA;
tmp = tmp->next;
tmpA = tmpA->next;
}
if (tmpB == NULL) {
return C;
} else {
tmp->next = tmpB;
tmp = tmp->next;
tmpB = tmpB->next;
}
}
}
队列 循环链表表示队列
#include "list.h" // 请不要删除,否则检查不通过
#include
#include
bool init_queue(LinkQueue* LQ) //二重指针
{
*LQ = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
if (*LQ == NULL)
return false;
(*LQ)->next = (*LQ);
return true;
}
bool enter_queue(LinkQueue* LQ, ElemType x)
{
LinkQueue p = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
if (p == NULL)
return false;
p->data = x;
p->next = (*LQ)->next;
(*LQ)->next = p;
(*LQ) = p;
return true;
}
bool leave_queue(LinkQueue* LQ, ElemType* x)
{
if ((*LQ)->next == (*LQ))
return false;
LinkQueue p = (*LQ)->next->next;
*x = p->data;
if ((*LQ)->next->next != (*LQ)) //多个节点
{
(*LQ)->next->next = (*LQ)->next->next->next;
} else //两个节点
{
(*LQ) = (*LQ)->next;
(*LQ)->next = (*LQ);
}
free(p);
return true;
}
栈 后缀表达式计算
#include "list.h" // 请不要删除,否则检查不通过
#include
#include
int compute_reverse_polish_notation(char* str)
{
int i = 0;
Stack S;
init_stack(&S);
ElemType number_to_push, num1, num2;
while (str[i] != '\0') {
if (str[i] != ' ') {
if (str[i] >= '0' && str[i] <= '9') {
number_to_push = 0;
while (str[i] != ' ' && str[i]) {
number_to_push = number_to_push * 10 + (str[i] - '0');
i++;
}
push(&S, number_to_push);
} else {
pop(&S, &num2);
pop(&S, &num1);
switch (str[i]) {
case '+': {
num1 += num2;
break;
}
case '-': {
num1 -= num2;
break;
}
case '*': {
num1 *= num2;
break;
}
case '/': {
num1 /= num2;
break;
}
case '%': {
num1 %= num2;
break;
}
}
push(&S, num1);
}
}
i++;
}
pop(&S, &num1);
return num1;
}