王道考研数据结构链表专题

王道后面的链表的代码实现:
link.h

#pragma once
typedef int ElemType;
typedef char Element;

typedef struct Node {
	Element data;
	struct Node* next;
}Node,* Link;

//定义一个单链表结点
typedef struct LNOde
{
	ElemType data;
	struct LNOde* next;
}LNode, * LinkList;
//定义一个双链表结点
typedef struct DNode {
	ElemType data;
	struct DNode* proir, * next;
}DNode, *DLinklist;
//定义一个Locate双链表结点
typedef struct Dlnode {
	ElemType data;
	struct Dlnode* prior, * next;
	ElemType freg;	//表示调用频度
}Dlnode, *DlocateList;

//数组尾插法建立单词单链表
void listchar_RailInsert(Link& L, char arr[], int len);
//正向建立循环双链表
void DlinkRailInsert(DLinklist& L ,int drr[], int len);
//数组尾插法建立单链表
void list_RailInsert1(LinkList& L, int arr[], int len);
//数组尾插法建立循环单链表
void list_RailInsertCycle(LinkList& L, int arr[], int len);
//遍历单链表
void arrayList(LinkList L);
//遍历输出循环单链表
void arrListCycle(LinkList L);
//1.递归删除不带头节点的单链表
void del_value(LinkList& L,ElemType x);
//2.一遍顺序扫描带头结点的单链表删除指定元素
void del_f(LinkList& L, ElemType x);
// 3. 反向输出带头结点单链表的每个节点的值
void ouputData(LinkList L);
//4.编写在带头结点的单链表L中删除一个最小节点的高效算法(假设最小节点值唯一)
void del_MinNode(LinkList& L);
void del_MinNode2(LinkList& L);
//5.将带头结点的单链表就地逆置(空间复杂度O(1))
void reverse(LinkList L);
//5.将带头结点的单链表就地逆置(空间复杂度O(1))
void reverse2(LinkList L);
//6.使带头节点的单链表元素递增有序
void addOrderly(LinkList L);

//7.在无序链表中删除给定的范围内元素的值
void del_values(LinkList& L, ElemType x, ElemType y);
// 7.在无序链表中删除给定的范围内元素的值
void del_values2(LinkList & L, ElemType x, ElemType y);

//8.找出两个单链表的公共节点
void findCommonNode(LinkList L1, LinkList L2);

//9.按递增次序输出单链表中各节点的数据元素,并释放节点所占的存储空间
void outputElement(LinkList L);

//10.将一个带头结点的单链表A分解为两个带头结点的单链表A和B,使得A原奇,B原偶
LinkList resolve(LinkList &L);

//11.将线性表拆分为两个单链表
LinkList decompose(LinkList &L);

//11.将线性表拆分为两个单链表
LinkList decompose2(LinkList& A);

//12.设计算法删除递增有序的单链表中出现的重复元素
void del_Element(LinkList& L);

//13.将两个有序递增单链表合并为递减单链表,并利用原来两个单链表的结点存放归并后的单链表
LinkList combine(LinkList& L1, LinkList& L2);

//14.设计算法从递增有序的单链表A和B中提取出公共元素产生单链表C,要求不破坏A、B结点
void extractCommon(LinkList L1, LinkList L2);

//15、两个递增有序的链表分别表示两个集合,编写函数求A、B交集存放于A集合中
void merge(LinkList& La, LinkList& Lb);

//16.判断单链表B是否包含单链表B
int contain(LinkList& La, LinkList& Lb);

//17.设计一个算法用于判断带头结点的循环双链表是否对称
int symmetry(DLinklist L);

//18. 合并两个循环单链表,使合并后的链表仍保持循环单链表形式
void combine2(LinkList La, LinkList Lb);

//19.设计算法寻找带头结点的循环单链表的最小值输出并删除,直到单链表为空,然后删除头结点
void del_MinAll(LinkList& L);

//20.locate(L,X)函数的编写 
void initlocate(DlocateList &L, int a[], int len);
//void locate(DlocateList L, int x);

//21.编写算法求倒数第k个结点的值
int fundkValue(LinkList L,int k);

//22.找出单链表保存的单词具有相同的后缀的第一个单词
void findCommon(Link La, Link Lb);

//23.删除重复元素值(包括绝对值),只保留第一个出现的元素
void delCommonValue(LinkList& L,int m);

//24.判断一个链表是否有环,有环则输出环的起始点
int isCycle(LinkList L);

//25.链表的重新排序
void resortLink(LinkList& L);

LinkPratice.cpp

#include<stdio.h>
#include<stdlib.h>
#include"link.h"


//数组尾插法建立单词单链表
void listchar_RailInsert(Link& L, char arr[], int len) {
	L = (Link)malloc(sizeof(Node));//创建头结点
	Node* s, * r = L;//r表示尾指针
	L->next = NULL;
	int i = 0;
	while (i < len) {
		s = (Node*)malloc(sizeof(Node));//建立一个新的节点
		s->data = arr[i++];
		r->next = s;
		r = s;
	}
	r->next = NULL;//尾指针置空;
	Node* p = L->next;
	while (p) {
		printf("%c", p->data);
		p = p->next;
	}
	printf("\n");
}
//数组尾插法建立单链表
void list_RailInsert1(LinkList& L,int arr[],int len) {
	int x;
	L = (LinkList)malloc(sizeof(LNOde));//创建头结点
	LNOde* s, * r = L;//r表示尾指针
	L->next = NULL;
	
	int i = 0;
	while (i<len) {
		s = (LNOde*)malloc(sizeof(LNOde));//建立一个新的节点
		s->data = arr[i++];
		r->next = s;
		r = s;
	}
	r->next = NULL;//尾指针置空;

}

//数组尾插法建立循环单链表
void list_RailInsertCycle(LinkList& L, int arr[], int len) {
	int x;
	L = (LinkList)malloc(sizeof(LNOde));//创建头结点
	LNOde* s, * r = L;//r表示尾指针
	L->next = NULL;

	int i = 0;
	while (i < len) {
		s = (LNOde*)malloc(sizeof(LNOde));//建立一个新的节点
		s->data = arr[i++];
		r->next = s;
		r = s;
	}
	r->next = L;//尾指针指向头结点;
}

//指针显示输出链表
void arrayList(LinkList L) {
	LNOde* first;
	first = L->next;
	while (first) {
		printf("%d ", first->data);
		first = first->next;
	}
	printf("\n");
}

//正向建立循环双链表(尾插法)
void DlinkRailInsert(DLinklist& L, int drr[], int len) {
	L = (DLinklist)malloc(sizeof(DNode));//创建循环链表头结点
	DNode* r = L;	//尾指针
	L->next = NULL;
	for (int i = 0; i < len; i++)
	{
		int x = drr[i];
		DNode* s = (DNode*)malloc(sizeof(DNode));//每次创建结点
		s->data = x;
		r->next = s;
		s->proir = r;
		r = s;
	}
	r->next = L;
	L->proir = r;

	DNode* p = L->next;
	while (p != L) {
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}

//1.递归删除不带头节点的单链表
void del_value(LinkList& L, ElemType x) {

	LNOde* p;//指向待删除的节点
	if (L == NULL) {
		return;			//递归的出口
	}
	if (L->data == x) {	//查找到值为x的L
		p = L;
		L = L->next;
		free(p);
		del_value(L, x);	//递归调用
	}
	else {				//若L指向的值不为x
		del_value(L->next, x);	 //递归调用
	}
}

//2.一遍顺序扫描带头结点的单链表删除指定元素
void del_f(LinkList& L, ElemType x) {
	LNOde* head = L->next; LNOde* pre = L, * q;//声明一个头结点,维护一个前驱
	while (head) {
		if (head->data == x) {	//查找到要删除的元素
			q = head;
			head = head->next;
			pre->next = head;	//删除*q节点
			free(q);		 // 释放*q节点的空间

		}
		else {
			head = head->next;
			pre = pre->next;
		}
	}
}

//3. 反向输出带头结点单链表的每个节点的值
void ouputData(LinkList L) {
	//LNOde* p = L, temp;//指针p表示头结点
	//LNOde* head = L->next;//头指针
	//p->next = head;
	//if (L->next != NULL) {
	//	head = head->next;
	//}
	//if (L->next == NULL) {	//到达最尾部就输出
	//	
	//	printf("%d ", L->data);
	//	ouputData(p);
	//}

	if (L->next != NULL) {		
		ouputData(L->next);
	}
	if (L != NULL) printf("%d ", L->data);
}

//4.编写在带头结点的单链表L中删除一个最小节点的高效算法(假设最小节点值唯一)
void del_MinNode(LinkList& L) {
	LNOde* min = L->next; LNOde* head = L->next; LNOde* p;
	while (head) {
		if (head->data < min->data) {
			min = head;
		}
		head = head->next;
	}
	int x = min->data;//最小元素的值 
	while (head){
		if (head->data == x) {
			p = head->next;// p指向最小元素节点的下一个节点
			head->data = head->next->data;//交换元素
			head->next = p->next;//将最小元素断链
			free(p);
		}
		head = head->next;
	}

}

//4.编写在带头结点的单链表L中删除一个最小节点的高效算法(假设最小节点值唯一)
void del_MinNode2(LinkList& L) {
	LNOde* pre = L, * p = pre->next;	//表示当前节点的前驱指针和当前指针;
	LNOde* minpre = pre, * minp = p;//表示最小节点的前驱指针和最小指针;
	while (p!=NULL) {
		if (p->data < minp->data) {
			minpre = pre;
			minp = p;
		}
		pre = p;
		p = p->next;
	}
	minpre->next = minp->next;	//删除最小节点
	free(minp);
}

//5.将带头结点的单链表就地逆置(空间复杂度O(1))
void reverse(LinkList L) {
	LNOde* p, * s;
	p = L->next;
	L->next = NULL;
	while (p != NULL) {
		s = p->next;
		p->next = L->next ;
		L->next = p;
		p = s;
	}
}

//5.将带头结点的单链表就地逆置(空间复杂度O(1))
void reverse2(LinkList L) {
	LNOde* p, * r;	//p为工作指针,r为p的后继,以防断链
	p = L->next;	//从L的第一个元素开始
	L->next = NULL;	//先将L的next域置空
	while (p != NULL) {	//依次将节点摘下
		r = p->next;	//暂存p的后继
		p->next = L->next;	//将p插入到头结点之后
		L->next = p;
		p = r;
	}
}

//6.使带头节点的单链表元素递增有序
void addOrderly(LinkList L) {
	LNode* p, * s;//表示当前工作指针和p的后继
	p = L->next;
	L->next = NULL;
	while (p != NULL) {	//开始断链
		s = p->next;
		
	}

}

//7.在无序链表中删除给定的范围内元素的值
void del_values(LinkList &L,ElemType x,ElemType y) {
	LNOde* p = L->next, * s;//p表示工作指针,s表示指向p的后继节点
	while (p) {
		if (p->data > x && p->data < y) {//找到符合条件的节点
			s = p->next;
			p->data = p->next->data;//将后继节点的值复制给p,然后只要删除s即可
			p->next->next = s->next;
			free(s);//释放空间
		}
		else {
			p = p->next;
			s = p->next;
		}
	}
}

//7.在无序链表中删除给定的范围内元素的值
void del_values2(LinkList& L, ElemType x, ElemType y) {
	LNOde* pre = L, * p = L->next;//表示当前节点的前驱和当前节点
	while (p) {
		if (p->data > x && p->data < y) {//找到符合条件的节点就删除
			pre->next = p->next;
			free(p);
			p = pre->next;
		}
		else {
			pre = p;
			p = p->next;
		}
	}
}

//8.找出两个单链表的公共节点
void findCommonNode(LinkList L1, LinkList L2) {
	LNOde* L1head = L1->next, * L2head = L2->next;//分别指向L1和L2的第一个节点
	while (L1head) {
		while (L2head) {
			if (L2head->data == L1head->data) {
				printf("%d ", L2head->data);//相同就直接输出
			}
			
				L2head = L2head->next;
			
		}
		L1head = L1head->next;		//L1指向下一个元素
		L2head = L2->next;			//每次比完后恢复原位
	}
}

//9.按递增次序输出单链表中各节点的数据元素,并释放节点所占的存储空间
void outputElement(LinkList L) {

}

//10.将一个带头结点的单链表A分解为两个带头结点的单链表A和B,使得A原序号奇,B原序号偶
LinkList resolve(LinkList &A) {
	LinkList B; int count = 0;
	B = (LinkList)malloc(sizeof(LNOde));	//创建B表表头
	B->next = NULL;		//初始化B表
	LNode* ra = A, *rb = B;			//ra和rb分别指向A和B的尾指针
	LNOde* p = A->next, * s;//p为工作指针
	A->next = NULL;//将A初始化
	while (p) {
		count++;
		//s = p->next;	//s为p的后继
		if ((count & 1) == 0) {	// 序号偶数则存在B中
			rb->next = p;
			rb = p;
		}
		else {			// 序号奇数则存在A中
			ra->next = p;
			ra = p;
		}
		p = p->next;
	}
	ra->next = NULL; rb->next = NULL;
	return B;
}

//11.将线性表拆分为两个单链表
LinkList decompose(LinkList &A) {
	LinkList B = (LinkList)malloc(sizeof(LNOde));	//创建B表头
	B->next = NULL;		//B表初始化
	LNOde* b = B, * a = A;//a为表头指针,b为表尾指针
	LNOde* p, * q;//p表示当前工作指针,q为p的后继
	p = A->next;
	//A->next = NULL; // 将A初始化
	while (p) {
		//s = p->next;
		a->next = p; a = p;	//插入A中
		p = p->next;
		if (p != NULL) {
			q = p->next;
			p->next = b->next;	//尾插法插入B中
			b->next = p;
			p = q;
		}
	}
		a->next = NULL;
		return B;
	}

//11.将线性表拆分为两个单链表
LinkList decompose2(LinkList& A) {
	int count = 0;
	LinkList B = (LinkList)malloc(sizeof(LNOde));	//创建B表头
	B->next = NULL;		//B表初始化
	LNOde* b = B, * a = A;//a为表头指针,b为表尾指针
	LNOde* p, * q;//p表示当前工作指针,q为p的后继
	p = A->next;
	A->next = NULL; // 将A初始化
	while (p) {
		count++;
		q = p->next;	//q为p的后继
		if ((count & 1) == 1) {
			a->next = p;
			a = p;	//插入A中
		}
		else {
			p->next = b->next;//尾插法插入B中
			b->next = p;
		}
		p = q;
	}
	a->next = NULL;
	return B;
}

//12.设计算法删除递增有序的单链表中出现的重复元素
void del_Element(LinkList &L) {
	LNOde* slow = L->next, * fast,*p;//设置快慢指针,p为暂时指针
	while (slow->next!=NULL) {
		fast = slow->next;
		if (fast->data == slow->data) {	//相等则表示有相同的元素
			slow->next = fast->next;
			p = fast;
			free(p);
		}
		else {
			slow = slow->next;
		}
		
	}
}

//13.将两个有序递增单链表合并为递减单链表,并利用原来两个单链表的结点存放归并后的单链表
LinkList combine(LinkList &L1, LinkList& L2) {
	LNOde* La = L1->next, * Lb = L2->next, *p;//La和Lb分别表示两个链表的第一个结点,p为工作指针
	L1->next = NULL; //将L1设置为当前合成的新链表;
	while (La && Lb) {//先找出两个链表的公共部分
		if (La->data <= Lb->data) {	//比较元素
			p = La->next;	//暂存La的后继结点
			La->next = L1->next;
			L1->next = La;

			La = p;	//La继续往下走
		}
		else {
			p = Lb->next;//暂存Lb的后继结点
			Lb->next = L1->next;
			L1->next = Lb;

			Lb = p;//Lb继续往下走
		}

	}
	if (La) {	//L1有剩余
		Lb = La;
	}
	while (Lb) {	//一起处理
		p = Lb->next;//暂存Lb的后继结点
		Lb->next = L1->next;
		L1->next = Lb;

		Lb = p;//Lb继续往下走
	}
	free(L2);
	return L1;
}

//14.设计算法从递增有序的单链表A和B中提取出公共元素产生单链表C,要求不破坏A、B结点
void extractCommon(LinkList L1, LinkList L2) {
	LNOde* La = L1->next, * Lb = L2->next,*r;
	LinkList C = (LinkList)malloc(sizeof(LNOde));//建立新表C
	r = C; //r始终指向C的尾结点
	while (La && Lb) {
		if (La->data < Lb->data) {	//小于的话La向后移一位
			La = La->next;
		}
		else if (La->data > Lb->data) {
			Lb = Lb->next;
		}
		else {			//相等则一起向后移一位
			LNOde* s = (LNOde*)malloc(sizeof(LNOde));//创建一个新的结点
			s->data = La->data;
			r->next = s;
			r = s;
			La = La->next;
			Lb = Lb->next;
		}
	}
	r->next = NULL;
	arrayList(C);
}

//15、两个递增有序的链表分别表示两个集合,编写函数求A、B交集存放于A集合中
void merge(LinkList& La, LinkList& Lb) {
	LNOde* pa = La->next, * pb = Lb->next, * pc = La,*temp;// pa,pb分别表示工作指针,pc指向La的头结点
	while (pa && pb) {
		if (pa->data == pb->data) {	//元素相等就加入pa
			pc ->next = pa;
			pc = pa;
			pa = pa->next;
			temp = pb;	//将pb中的结点释放
			pb = pb->next;
			free(temp);	//释放结点temp
		}
		else if (pa->data < pb->data) {
			temp = pa;
			pa = pa->next;
			free(temp);//释放结点temp
		}
		else {
			temp = pb;
			pb = pb->next;
			free(temp);//释放结点temp
		}
	}
	while (pa) {//while循环结束后,如果La中还有剩余则遍历
		temp = pa;
		pa = pa->next;
		free(temp);//释放结点temp
	}
	while (pb) {//while循环结束后,如果Lb中还有剩余则遍历
		temp = pb;
		pb = pb->next;
		free(temp);//释放结点temp
	}
	pc->next = NULL;
	free(Lb);
	arrayList(La);
}

//16.判断单链表B是否包含单链表B
int contain(LinkList& La, LinkList& Lb) {
	LNOde* pa = La->next, * pb = Lb->next, * pre = pa;//pa和pb分别表示工作指针
	while (pa && pb) {
		if (pa->data == pb->data) {
			pa = pa->next;
			pb = pb->next;
		}
		else {
			pre = pre->next;	//A从下一个元素开始
			pa = pre;
			pb = Lb->next;		// B每次从头开始
		}
	}
	if (pb == NULL) {	//判断pb是否能比较完了
		return 1;
	}
	return 0;
}

//17.设计一个算法用于判断带头结点的循环双链表是否对称
int symmetry(DLinklist L) {
	//从两边扫描循环双链表,判断是否对称
	DNode* p = L->next, *q = L->proir;
	while (p != q && q->next != p) {
		if (p->data == q->data) {
			p = p->next;
			q = q->proir;
		}
		else {
			return 0;
		}
	}
	return 1;
}

//18. 合并两个循环单链表,使合并后的链表仍保持循环单链表形式
void combine2(LinkList La, LinkList Lb) {
	LNOde* h1 = La, * h2 = Lb, * p = Lb->next;//h1和h2分别指向循环单链表的头结点
	Lb->next = NULL;//断链Lb
	while (h1->next != La) {
		h1 = h1->next;
	}
	h1->next = p;
	while (h1->next != Lb) {
		h1 = h1->next;
	}
	h1->next = La;
	arrListCycle(La);
}

//遍历输出循环单链表
void arrListCycle(LinkList L) {
	LNOde* f = L->next;
	while (f && f != L) {
		printf("%d ", f->data);
		f = f->next;
	}
	printf("\n");
}

//19.设计算法寻找带头结点的循环单链表的最小值输出并删除,直到单链表为空,然后删除头结点
void del_MinAll(LinkList& L) {
	while (L->next != L) {	//当链表不为空时一直循环
		LNOde* p = L->next, * pre = L, *minp=p,*minpre=pre;	//p为工作指针,pre为p的前驱
		while (p != L) {
			if (minp->data > p->data) {
				minp = p;	//min指向最小元素
				minpre = pre;
			}
			pre = p;
			p = p->next;
		}
		printf("%d ", minp->data);//输出最小元素
		minpre->next = minp->next;//删除最小值指针结点
		free(minp);
	}
	free(L);
}

//尾插法创建locate双链表
void initlocate(DlocateList &L,int a[],int len) {
	L = (DlocateList)malloc(sizeof(Dlnode));//建立双链表头结点
	Dlnode* s, * r;//r为尾指针
	r = L;
	int i = 0;
	while (i<len) {
		s = (Dlnode*)malloc(sizeof(Dlnode));//创建结点
		s->data = a[i++];//赋值
		s->freg = 0;
		r->next = s;//插入
		s->prior = r;
		r = s;
	}
	r->next = NULL;
	Dlnode *p = L->next;
	while (p) {
		printf("%d ", p->data);
		p = p->next;
	}
}
//20.locate(L,X)函数的编写 
//void locate(DlocateList L, int x) {
//	Dlnode* p = L->next, * pre=L;//p第一个工作指针,temp为临时指针
//	while (p) {
//		if (p->data == x) {	//找到相同结点时,freg加一 
//			p->freg++;	//同时插入到头结点后面
//
//			pre->next = p;
//			pre->next = p->next;	//删除节点temp 
//			p->next->prior=p->prior;
//			//然后插入到头结点后面即可
//			Dlnode* s = (Dlnode*)malloc(sizeof(Dlnode));
//			s->data = x;
//			s->next = L->next;
//			L->next->prior = s;
//			L->next = s;
//			s->prior = L;
//		}
//		p = p->next;
//	}
//	Dlnode* p = L->next;
//	while (p) {
//		printf("%d ", p->data);
//		p = p->next;
//	}
//	printf("\n");
//}

//21.编写算法求倒数第k个结点的值
int fundkValue(LinkList L,int k) {
	LNOde* list = L, * slow = list->next,*temp=list->next, * fast;	//list为头指针
	while (k-- >0 && temp!=NULL) {
		temp = temp->next;
	}
	if (k > 0) {
		return 0;
	}
	else {
		fast = temp;
		while (fast) {
			slow = slow->next;
			fast = fast->next;
		}
		printf("输出的倒数第%d 个结点的值为%d \n",k, slow->data);
		return 1;
	}
	
}

//22.找出单链表保存的单词具有相同的后缀的第一个单词
void findCommon(Link La, Link Lb) {
	Node* p = La->next, * q = Lb->next,*s1=La->next,*s2=Lb->next;//str1和str2分别是La和Lb的第一个结点
	int count1 = 0, count2 = 0;
	while (p) {
		count1++;
		p = p->next;
	}
	while (q) {
		count2++;
		q = q->next;
	}
	int temp =count1-count2;
	while (temp-- > 0) {
		s1 = s1->next;
	}
	while (s1 && s2) {
		if (s1->data == s2->data) {
			printf("%c", s1->data);
			return;
		}
		else {
			s1 = s1->next;
			s2 = s2->next;
		}
	}
	printf("\n");
}

//23.删除重复元素值(包括绝对值),只保留第一个出现的元素
void delCommonValue(LinkList& L, int n) {
	LNOde* p = L, * r;
	int* q, m;
	q = (int*)malloc(sizeof(int) * (n + 1));	//申请n+1个位置的辅助空间
	for (int i = 0; i < n + 1; i++){
		*(q + i) = 0;				//数组元素初始值赋值0
	}
		while (p->next != NULL) {//遍历单链表元素
			m = p->next->data > 0 ? p->next->data : -p->next->data;	//判断元素的正负
			if (*(q + m) == 0) {	//判断该节点的data是否出现过
				*(q + m) = 1;		//第一次出现
				p = p->next;		//保留
			}
			else {					//重复出现则删除
				r = p->next;
				p->next = r->next;
				free(r);
			}
		}
	free(q);
	arrayList(L);
}

//24.判断一个链表是否有环,有环则输出环的起始点
int isCycle(LinkList L) {
	LNOde* slow = L->next, * fast = L->next;	//设置快慢指针
	while (slow != NULL&&fast->next!=NULL) {
		fast = fast->next->next;	//快指针每次走两步
		slow = slow->next;		//慢指针每次走一步
		if (fast == slow) {
			return fast->next->data;	//如果快慢指针相同则一定有环且下一个指针即为出口
		}
	}
	return 0;
}

//25.链表的重新排序
void resortLink(LinkList& L) {
	
}

LinkTest.cpp

#include<stdio.h>
#include"link.h"
int  main() {
    LinkList link, link1, link3, link4,link5; DlocateList dlocate; Link charlink,charlink1;
    DLinklist Dlink;
    int arr[] = {1,2,3,4,5,6,7};
    int arr2[] = {3,4,5,7};
    int len = sizeof(arr) / sizeof(int);
    int len2 = sizeof(arr2) / sizeof(int);
    list_RailInsert1(link,arr,len);
    list_RailInsert1(link1, arr2, len2);
    printf("尾插法建立的单链表为:\n");
    arrayList(link); arrayList(link1);
    printf("递归删除后的单链表为:\n");
    del_value(link,2);//1.递归删除元素
    del_f(link,2);//2.一遍顺序扫描删除指定元素
    arrayList(link);
    ouputData(link);//3. 反向输出带头结点单链表的每个节点的值
    printf("\n");
    printf("删除最小节点元素后的单链表为:\n");
    del_MinNode(link);//4.编写在带头结点的单链表L中删除一个最小节点的高效算法(假设最小节点值唯一)
    arrayList(link);
    del_MinNode2(link);
    arrayList(link);
    //将带头结点的单链表就地逆置(空间复杂度O(1))
     printf("单链表就地逆置后为:\n");
     reverse(link); arrayList(link);
     reverse2(link); arrayList(link);
     printf("删除指定区间后的元素为:\n");
     del_values2(link, 2, 5); arrayList(link);
     printf("尾插法建立的单链表2为:\n");
    // list_RailInsert(link1);
     printf("输出两个链表相同的元素:\n");
     findCommonNode(link, link1);
     printf("递增输出单链表中的各元素:\n");
     outputElement(link);
     printf("输出分解后的两个单链表为:\n");
     /*link3 = resolve(link);
     arrayList(link3);
     arrayList(link);*/
     /*printf("变换后的两个单链表分别为:\n");
     link3 = decompose(link); arrayList(link3);
     arrayList(link);*/
     printf("输出删除重复元素后的单链表为:\n");
     del_Element(link);  arrayList(link);
     printf("输出合并后的单链表为:\n");
     arrayList(combine(link,link1));
     /*printf("输出两个链表的公共元素为:\n");
     extractCommon(link, link1);
     printf("输出归并后的单链表为:\n");
     merger(link, link1);*/
     printf("输出单链表A中是否包含单链表B的结果:\n");
     printf("%d \n",contain(link, link1));
     int drr[] = {1,2,1};
     int dlen = sizeof(drr) / sizeof(int);
     printf("创建的循环双链表为: \n");
     DlinkRailInsert(Dlink,drr,dlen);
     printf("输出的结果为:%d \n", symmetry(Dlink));
     printf("合并后的循环单链表为:\n");
     int dlink[] = { 1,2,3 }; int lend1 = sizeof(dlink) / sizeof(int);
     int dlink2[] = { 4,5,6 }; int lend2 = sizeof(dlink2) / sizeof(int);
     list_RailInsertCycle(link3, dlink, lend1);
     list_RailInsertCycle(link4, dlink2, lend2);
     combine2(link3, link4); printf("\n");
     LinkList minlist;
     int min[] = { 3,2,4,6,9,2 };
     int lenmin = sizeof(min) / sizeof(int);
     list_RailInsertCycle(minlist, min, lenmin);
     printf("插入后的循环单链表为:\n"); arrListCycle(minlist);
     printf("输出依次找到的最小值为:\n");
     del_MinAll(minlist);
     printf("\n");
     printf("输出创建的双链表为:\n");
     int a[] = {1,4,6,7,9,5};
     int le = sizeof(a) / sizeof(int);
     initlocate(dlocate,a,le);//创建locate双链表
     printf("\n");
     printf("输出双链表按频度访问节点的所有元素:\n");
     //locate(dlocate, 6);
     printf("输出倒数第k个结点的值:\n");
     printf("返回的结果为:%d\n", fundkValue(link, 1));
     printf("插入的两个单词单链表为:\n");
     char ch[] = {'l','o','d','o','i','n','g'};
     int chlen = sizeof(ch) / sizeof(char);
     char ch1[] = { 'b','e','o','i','n','g' };
     int chlen1 = sizeof(ch1) / sizeof(char);
     listchar_RailInsert(charlink, ch, chlen);
     listchar_RailInsert(charlink1, ch1, chlen1);
     printf("输出的两个单链表的第一个相同的后缀字母为:\n");
     findCommon(charlink,charlink1);
     int del[] = { -2,-2,-3,3,4,5,7,-7 };
     int dellen = sizeof(del) / sizeof(int);
     list_RailInsert1(link5, del, dellen);
     printf("建立的单链表为:\n"); arrayList(link5);
     printf("输出删除绝对值相同的元素后的单链表为:\n");
     delCommonValue(link5,7);
     printf("判断链表是否有环:%d", isCycle(link5));
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值