DataStructure-单链表的操作

单链表的操作

题目

单链表的构建,插入,删除,修改,查找(一般不用,单纯遍历)

例题1

A,B两个单链表(带头结点),其中元素递增有序,设计一个算法,将A,B归并成一个,按元素非递减的链表C,C有A,B中的结点组成

分析:

A,B单链表元素递增,只需从A,B的开始结点中选出一个较小的来插入C的尾部即可,

A,B中剩余的元素,则将A或B连接到C的尾部即可。

输入:

1 3 5 7 -1
2 4 6 8 -1

输出:

1 2 3 4 5 6 7 8 9
头插法-创建链表
//创建链表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;
}
尾插法-创建链表
//创建链表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成为新的开始结点

	}
}
头插法连接双链表
//头插法
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;
}
尾插法双链表连接

扩展:尾插法双链表连接

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;
	}
}
完整程序
#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值