欢迎来到CloudService文涵的博客

人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

函数题

汇总

单链表统计大写字母个数
int CharacterCount(LinkList L) {
int count = 0; // 初始化计数器count为0
L = L->next; // 将链表头节点跳过,指向第一个实际节点
while (L != NULL) { // 进入循环,遍历链表直到链表末尾
count += (L->data >= 'A' && L->data <= 'Z') ? 1 : 0; // 如果当前节点的数据是大写字母,则计数器count加1,否则加0
L = L->next; // 将指针L指向下一个节点
}
return count; // 返回大写字母的个数
}

逆置链表
void reverseList(LinkList &La) {
LNode *prev = NULL, *current = La.head->next, *next; // 声明三个指针变量:prev、current、next,分别用于指向前一个节点、当前节点和下一个节点
while (current != NULL) { // 当前节点不为空时执行循环,即遍历链表
next = current->next; // 将next指针指向当前节点的下一个节点,保存下一个节点的地址
current->next = prev; // 将当前节点的next指针指向前一个节点,即将链表反转
prev = current; // 将prev指针指向当前节点,更新prev为当前节点
current = next; // 将current指针指向下一个节点,继续遍历链表
}
La.head->next = prev; // 将头节点的next指针指向反转后的链表的第一个节点,完成链表反转
}

求一组数中的最大值、最小值和平均值
float fun(int a[], int n, int *max, int *min) {
float sum = 0; // 初始化求和变量sum为0
*max = *min = a[0]; // 将max和min指针指向的值都设为数组a的第一个元素
for (int i = 0; i < n; i++) { // 遍历数组a
if (a[i] > *max) // 如果当前元素大于max指针指向的值,则更新max的值为当前元素的值
*max = a[i];
if (a[i] < *min) // 如果当前元素小于min指针指向的值,则更新min的值为当前元素的值
*min = a[i];
sum += a[i]; // 累加求和
}
return sum / n; // 返回数组元素的平均值
}

从尾到头输出单链表
void printListFromTail2Head(LinkNode* head) {
if (head != NULL) { // 如果头节点不为空
printListFromTail2Head(head->next); // 递归调用函数,传入头节点的下一个节点
printf("%d ", head->data); // 打印当前节点的数据
}
}

统计单链表的数据元素结点个数并输出最大最小值
int getListLen(LinkList h, DataType* min, DataType* max)
{
PNode p = h->next; // 声明并初始化指向链表头节点的指针p,指向第一个节点的指针
int len = 0; // 初始化链表长度为0
*min = p->data; // 将min指针指向的值设为链表第一个节点的值
*max = p->data; // 将max指针指向的值设为链表第一个节点的值
while (p != NULL) { // 遍历链表
len++; // 累加链表长度
if (p->data < *min) { // 如果当前节点的值小于min指针指向的值,则更新min的值为当前节点的值
*min = p->data;
}
if (p->data > *max) { // 如果当前节点的值大于max指针指向的值,则更新max的值为当前节点的值
*max = p->data;
}
p = p->next; // 将指针p指向下一个节点,继续遍历链表
}
return len; // 返回链表的长度
}

单链表统计奇数个数
int OddNumber(LinkList L) {
LinkList p = L->next; // 声明并初始化指向链表第一个节点的指针p
int count = 0; // 初始化奇数元素计数器为0
while (p != NULL) { // 遍历链表
if (p->data % 2 != 0) { // 判断当前节点的数据是否为奇数
count++; // 如果是奇数,计数器加1
}
p = p->next; // 指针p指向下一个节点,继续遍历链表
}
return count; // 返回奇数元素的个数
}

有序单链表去重
LNode* DelR(LNode* h) {
LNode* newH = NULL; // 新链表头节点指针
LNode* newTail = NULL; // 新链表尾节点指针
LNode* p = h; // 指向当前节点的指针p
LNode* q; // 指向下一个节点的指针q
LNode* dup; // 保存需要删除的重复节点

while (p != NULL) { // 遍历链表
q = p->next; // 指针q指向下一个节点

if (q == NULL || p->data != q->data) { // 如果p节点和q节点的值不同,或者q节点为NULL,说明p节点没有重复
p = q; // 将指针p指向下一个节点,继续判断
continue;
}

dup = q; // 如果p节点和q节点的值相同,将q节点保存到dup指针中
p->next = q->next; // 将p节点的next指针指向q节点的下一个节点,跳过重复节点

if (newH == NULL) { // 如果新链表为空,将dup节点设置为新链表的头尾节点
newH = dup;
newTail = dup;
} else { // 如果新链表不为空,将dup节点添加到链表末尾
newTail->next = dup;
newTail = dup;
}

q = p->next; // 将指针q指向下一个节点,继续判断
}

return newH; // 返回新链表的头节点指针
}

合并链表
void mergeList(LinkList &La, LinkList &Lb, LinkList &Lc) {
LNode *pa = La.head->next; // 指向链表La的第一个节点
LNode *pb = Lb.head->next; // 指向链表Lb的第一个节点
LNode *pc = Lc.head = La.head; // 指向链表Lc的头节点,同时将Lc的头节点指向La的头节点
while (pa && pb) { // 当pa和pb都不为空时执行循环
if (pa->data < pb->data) { // 如果节点pa的值小于节点pb的值
pc->next = pa; // 将pc的next指针指向pa
pc = pa; // 将pc指向pa
pa = pa->next; // 将pa指向下一个节点
} else if (pa->data > pb->data) { // 如果节点pa的值大于节点pb的值
pc->next = pb; // 将pc的next指针指向pb
pc = pb; // 将pc指向pb
pb = pb->next; // 将pb指向下一个节点
} else { // 如果节点pa的值等于节点pb的值
pc->next = pa; // 将pc的next指针指向pa
pc = pa; // 将pc指向pa
pa = pa->next; // 将pa指向下一个节点
LNode *temp = pb; // 保存pb节点的地址到temp
pb = pb->next; // 将pb指向下一个节点
delete temp; // 删除temp指向的节点,即删除重复节点
}
}
pc->next = pa ? pa : pb; // 将剩余的节点连接到pc的next指针上
delete Lb.head; // 删除Lb的头节点
}

6-1 单链表统计大写字母个数

image

int CharacterCount(LinkList L) {
int count = 0;
LNode* p = L->next;
while (p != NULL) {
if (p->data >= 'A' && p->data <= 'Z') {
count++;
}
p = p->next;
}
return count;
}

6-2 逆置链表

image

void reverseList(LinkList La) {
if (La.head == NULL || La.head->next == NULL) {
return;
}

LNode *prev = NULL;
LNode *curr = La.head->next;
while (curr) {
LNode *next_node = curr->next;
curr->next = prev;
prev = curr;
curr = next_node;
}

La.head->next = prev;
}

6-3 求一组数中的最大值、最小值和平均值

image

float fun(int a[],int n,int *max,int min)
{
float sum=0;
max=min=a[0];
for(int i=0;i<n;i++)
{
if(a[i]>
max)
max=a[i];
if(a[i]<
min)
*min=a[i];
sum+=a[i];
}
return sum/n;
}

6-4 从尾到头输出单链表

image

void printListFromTail2Head(LinkNode* head) {
if (head != NULL) {
printListFromTail2Head(head->next);
printf("%d ", head->data);
}
}

6-5 统计单链表的数据元素结点个数并输出最大最小值【可本地编译器调试】

image

int getListLen(LinkList h, DataType* min, DataType* max)
{
if (h->next == NULL) {
*min = *max = 0;
return 0;
}
PNode p = h->next;
int len = 0;
*min = p->data;
*max = p->data;
while (p != NULL) {
len++;
if (p->data < *min) {
*min = p->data;
}
if (p->data > *max) {
*max = p->data;
}
p = p->next;
}
return len;
}

6-6 单链表统计奇数个数

image

int OddNumber(LinkList L)
{
int count = 0;
LNode* p = L->next;
while (p)
{
if (p->data % 2 != 0)
{
count++;
}
p = p->next;
}
return count;
}

6-7 有序单链表去重

image

LNode* DelR(LNode *h){
if(h == NULL) return NULL;//一定要有这步,判断是否为空,有测试点设置
LNode *p1 = h, *p2 = h->next;
LNode *head, tail, p;
head = (struct node
) malloc(sizeof(struct node));
head->next = NULL;
tail = head;
while(p2){
if(p2->data == p1->data){
//插入新链表
p = (struct node
) malloc(sizeof(struct node));
p->data = p2->data;
tail->next = p;
tail = p;

//删除
p1->next = p2->next;
free(p2);
}else p1 = p2;
p2 = p1->next;
}
tail->next = NULL;
return head->next;
}

6-8 合并链表

image

void mergeList(LinkList &La, LinkList &Lb, LinkList &Lc) {
LNode *pa = La.head->next;
LNode *pb = Lb.head->next;
LNode *pc = Lc.head = La.head; // 将Lc的头结点指向La的头结点
while (pa && pb) {
if (pa->data < pb->data) { // 如果pa的数据小于pb的数据
pc->next = pa;
pc = pa;
pa = pa->next;
} else if (pa->data > pb->data) { // 如果pa的数据大于pb的数据
pc->next = pb;
pc = pb;
pb = pb->next;
} else { // 如果pa和pb的数据相等,则只取一个节点,跳过另一个节点
pc->next = pa;
pc = pa;
pa = pa->next;
LNode *temp = pb;
pb = pb->next;
delete temp; // 释放重复节点的内存
}
}
pc->next = pa ? pa : pb; // 将剩余的节点接在合并后的链表末尾
delete Lb.head; // 释放Lb的头结点
}

posted on 2023-12-18 16:03  Cloudservice  阅读(75)  评论(0)    收藏  举报