设计一个算法将带头结点的单链表Ha分解为两个具有相同结构的链表Hb,Hc。其中Hb表中的节点为值小于零的节点,而Hc表的节点为Ha表中值大于等于0的节点(其中Ha中的节点值的类型为整形)
#include "pch.h"
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<stdio.h>
struct Node{
int a;
struct Node *next;
};
//创建函数
void MargeList_L(Node &La, Node &Lb, Node &Lc) {
Node *H = (Node*)malloc(sizeof(Node));
H = La.next;
Lb.a = 0;
Lc.a = 0;
while (H != NULL) {
Node *p = (Node*)malloc(sizeof(Node));
if (H->a < 0) {
p->a = H->a;
p->next = Lb.next;
Lb.next = p;
Lb.a++;
}
else {
p->a = H->a;
p->next = Lc.next;
Lc.next = p;
Lc.a++;
}
H = H->next;
}
}
int main()
{
printf("依次输入链表Ha的值(链表长度为10):\n");
//创建头节点
Node *Ha = (Node*)malloc(sizeof(Node));
Ha->next = NULL;
int i=0;
Ha->a = 10;
while (i<10) {
//创建插入节点
Node *H = (Node*)malloc(sizeof(Node));
scanf("%d", &H->a);
H->next = Ha->next;
Ha->next = H;
i++;
}
/*
//输出链表Ha
Node *H = (Node*)malloc(sizeof(Node));
H = Ha->next;
while(H!=NULL){
printf("%d\n", H->a);
H = H->next;
}*/
//算法开始
//创建Hb,Hc 链表头节点
Node *Hb= (Node*)malloc(sizeof(Node));
Node *Hc = (Node*)malloc(sizeof(Node));
Hb->next = NULL;
Hc->next = NULL;
MargeList_L(*Ha, *Hb, *Hc);
printf("链表Hb的长度:%d\n链表Hc的长度%d\n", Hb->a, Hc->a);
printf("链表Hb\n");
Node *hb = (Node*)malloc(sizeof(Node));
hb = Hb->next;
while (hb != NULL) {
printf("%d\n", hb->a);
hb = hb->next;
}
printf("链表Hc\n");
Node *hc = (Node*)malloc(sizeof(Node));
hc = Hc->next;
while (hc != NULL) {
printf("%d\n", hc->a);
hc = hc->next;
}
}
试题总结
头插法建立链表
Node *H = (Node*)malloc(sizeof(Node));
scanf("%d", &H->a);
H->next = Ha->next;
Ha->next = H;
测试用例是不断给一个值让返回结果,这就需要不断从scanf中获得数据,方法是
while(scanf("%d",&n)!=EOF){
}
用EOF来判断输入是否结束。
在JAVA中通过
while(scanner.hasNext()){
}
来判断。
结构体
试编写在头节点的单链表中删除一个最小值结点的高效算法
//试编写在头节点的单链表中删除一个最小值结点的高效算法
#include "pch.h"
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<stdio.h>
struct Node{
int a;
struct Node *next;
};
/*//创建函数
void MargeList_L(Node &La, Node &Lb, Node &Lc) {
Node *H = (Node*)malloc(sizeof(Node));
H = La.next;
Lb.a = 0;
Lc.a = 0;
while (H != NULL) {
Node *p = (Node*)malloc(sizeof(Node));
if (H->a < 0) {
p->a = H->a;
p->next = Lb.next;
Lb.next = p;
Lb.a++;
}
else {
p->a = H->a;
p->next = Lc.next;
Lc.next = p;
Lc.a++;
}
H = H->next;
}
}*/
int main()
{
printf("依次输入链表Ha的值(链表长度为10):\n");
//创建头节点
Node *Ha = (Node*)malloc(sizeof(Node));
int i=0;
Ha->a = 10;
//创建尾指针
Node *r = (Node*)malloc(sizeof(Node));
r = Ha;
while (i<3) {
//创建插入节点
Node *H = (Node*)malloc(sizeof(Node));
scanf("%d", &H->a);
r->next = H;
r = H;
i++;
}
r->next =NULL;
Node *H = (Node*)malloc(sizeof(Node));
H = Ha->next;
int min;
min = H->a;
//创建一个最小值结点的前驱结点标靶
Node *premin = (Node*)malloc(sizeof(Node));
//创建一个最小值结点的前驱结点
Node *pmin = (Node*)malloc(sizeof(Node));
//创建一个节点,使该节点指向值最小的结点
Node *minJ = (Node*)malloc(sizeof(Node));
minJ = H;
premin = Ha;
pmin = premin;
while(H!=NULL){
//取第一个元素为最小值,对列表进行循环,判断!
if (min > H->a) {
min = H->a;
minJ = H;
pmin = premin;
}
premin = premin->next;
H = H->next;
}
pmin->next = pmin->next->next;
free(minJ);
Node *H3 = (Node*)malloc(sizeof(Node));
H3 = Ha->next;
while (H3 != NULL) {
printf("%d\n", H3->a);
H3 = H3->next;
}
//算法开始
/*//创建Hb,Hc 链表头节点
Node *Hb= (Node*)malloc(sizeof(Node));
Node *Hc = (Node*)malloc(sizeof(Node));
Hb->next = NULL;
Hc->next = NULL;
MargeList_L(*Ha, *Hb, *Hc);
printf("链表Hb的长度:%d\n链表Hc的长度%d\n", Hb->a, Hc->a);
printf("链表Hb\n");
Node *hb = (Node*)malloc(sizeof(Node));
hb = Hb->next;
while (hb != NULL) {
printf("%d\n", hb->a);
hb = hb->next;
}
printf("链表Hc\n");
Node *hc = (Node*)malloc(sizeof(Node));
hc = Hc->next;
while (hc != NULL) {
printf("%d\n", hc->a);
hc = hc->next;
}*/
}
试题解析
尾插法建立单链表
printf("依次输入链表Ha的值(链表长度为10):\n");
//创建头节点
Node *Ha = (Node*)malloc(sizeof(Node));
int i=0;
Ha->a = 10;
//创建尾指针
Node *r = (Node*)malloc(sizeof(Node));
r = Ha;
while (i<3) {
//创建插入节点
Node *H = (Node*)malloc(sizeof(Node));
scanf("%d", &H->a);
r->next = H;
r = H;
i++;
}
r->next =NULL;