c语言数据结构大作业答案,C语言数据结构-2020级ICODING答案分享

本文详细介绍了数据结构中顺序表和链表的操作方法,包括删除指定范围内的元素、删除重复元素、调整顺序表中的数据分布、在链表中删除特定范围的节点、查找链表中的倒数第k个元素、合并两个链表以及使用循环链表实现队列等实用功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

顺序表 删除指定范围

#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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值