Operaciones de lista enlazadas individualmente
tema
Construcción, inserción, eliminación, modificación, búsqueda de listas enlazadas individualmente (generalmente no se usa, recorrido simple)
Ejemplo 1
A y B son dos listas con enlace único (nodos principales), en los que los elementos están en orden ascendente. Diseñe un algoritmo para fusionar A y B en una lista enlazada no decreciente C por elementos. C se compone de nodos en A y B.
analizar:
Los elementos de la lista A, B vinculados individualmente se incrementan, simplemente seleccione uno más pequeño de los nodos iniciales de A y B para insertarlo al final de C,
Para los elementos restantes en A y B, simplemente conecte A o B al final de C.
ingresar:
1 3 5 7 -1
2 4 6 8 -1
producción:
1 2 3 4 5 6 7 8 9
Interpolación de cabezas: creación de una lista enlazada
//创建链表1.头插法
void CreateListHead(List C){
LNode* s,* r;
C = (LNode*)malloc(sizeof(LNode));
C->next = NULL;
r = C;
int x = 0;
while (scanf_s("%d", &x) && x > 0) {
s = (LNode*)malloc(sizeof(LNode));//s指向新申请的结点
s->data=x;
/*下边两句是头插法的灵魂*/
r->next = s;//用r来接受新的结点
//为什么不用L->next=s;ans:如果这样操作,头结点就会丢失,最終头结点会指向最后一个节点
r = r->next;//r指向终端结点,以便于接纳下一个新到来的LNode
}
r->next = NULL;
}
Método de inserción de cola: cree una lista enlazada
//创建链表2.尾插法
void CreateListBack(LNode *&C) {
LNode* s;
C = (LNode*)malloc(sizeof(LNode));
C->next = NULL;
int x;
while (scanf_s("%d", &x) && x > 0) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = C->next;//s所指新结点的指针域next指向C的开始结点
C->next = s;//头结点指针域next指向s结点,0使得s成为新的开始结点
}
}
Conectar lista de doble enlace por interpolación principal
//头插法
void mergeHead(LNode* A, LNode* B, LNode*& C) {
LNode* p = A->next;
LNode* q = B->next;
LNode* r;//r始终指向C的终端结点
C = A;
C->next = NULL;
free(B);
r = C;
while (p != NULL && q != NULL) {
if (p->data <= q->data) {
r->next = p; p = p->next;
r = r->next;
}
else {
r->next = q; q = q->next;
r = r->next;
}
}
if (p != NULL) r->next = p;
if (q != NULL) r->next = q;
}
Unión de lista de enlaces dobles de inserción de cola
Extensión: conexión de lista enlazada doble de inserción de cola
void mergeBack(LNode* A, LNode* B, LNode* &C) {
LNode* p = A->next;
LNode* q = B->next;
LNode* s;
C = A;
C->next = NULL;
free(B);
while (p != NULL && q != NULL) {
if (p->data <= q->data) {
s = p; p = p->next;
s->next = C->next;
C->next = s;
}
else {
s = q; q = q->next;
s->next = C->next;
C->next = s;
}
}
while (p != NULL) {
s = p;
p = p->next;
s->next = C->next;
C->next = s;
}
while (q != NULL) {
s = q;
q = q->next;
s->next = C->next;
C->next = s;
}
}
programa completo
#include<iostream>
using namespace std;
typedef struct LNode {
int data;
struct LNode* next;
}LNode, *List ;
void CreateListHead(LNode* &L) {
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
LNode* r,*s;
r = L;
int x = 0;
while (scanf_s("%d", &x) && x > 0) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = r->next;
}
r->next = NULL;//输入元素已全部装入链表,L的终端终点指针域置为NULL,L建立完毕
//如果缺少这一步,会导致链表遍历指针域未初始化
}
void mergeHead(LNode* A, LNode* B, LNode*& C) {
LNode* p = A->next;
LNode* q = B->next;
LNode* r;//r始终指向C的终端结点
C = A;
C->next = NULL;
free(B);
r = C;
while (p != NULL && q != NULL) {
if (p->data <= q->data) {
r->next = p; p = p->next;
r = r->next;
}
else {
r->next = q; q = q->next;
r = r->next;
}
}
if (p != NULL) r->next = p;
if (q != NULL) r->next = q;
}
int main() {
List L1, L2;
CreateListHead(L1);
CreateListHead(L2);
List L3;
mergeHead(L1,L2,L3);
while (L3->next != NULL) {
cout << L3->next->data << " ";
L3 = L3->next;
}
return 0;
}