链表的基本运用实现整理

写在前面:分享技术,共同进步,有不足请见谅,相关意见可评论告知 ~

编程路漫之远兮,运架构体之帷幄;
劝君专注案前事,亦是杯酒敬苍生;

头文件及其相关操作

# include <stdio.h>
# include <stdlib.h>
# include <cstdlib>


typedef int ElemType;
typedef struct LNode
{
	ElemType data ; 
    struct LNode *next ;
}LNode , *LinkList ;

typedef enum Bool
{
    FALSE,TRUE
}Bool; 

函数声明

Bool CreateList_L(LinkList &L,int n) ;
void print(LinkList L) ;
Bool GetElem_L(LinkList L,int i, ElemType &e) ;
Bool ListInsert_L (LinkList &L,int i , ElemType e) ;
Bool ListDelete_L(LinkList &L ,int i ,ElemType &e) ;
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc) ;

函数功能

创建链表

Bool CreateList_L(LinkList &L,int n){
	
	LinkList p ;
	L = (LinkList) malloc (sizeof (LNode))   ;
	L->next = NULL ;
	printf("请输入元素个数
") ;
	for(int i=n ; i>0 ; --i) {
		p = (LinkList) malloc (sizeof(LNode)) ;
		printf("第%d个元素
",i) ; 
		scanf("%d",&p->data) ;
		p->next = L->next ;
		L->next = p ; 
	}
	return TRUE ;
	
}

输出链表

void print(LinkList L){
	LinkList p = L->next ;
	while(p!= NULL){
		printf("%d	",p->data);
         p = p->next; 
	}
}

按位查找与获取

Bool GetElem_L(LinkList L,int i, ElemType &e){
		LinkList p ;
		p = L->next ;
		int j =1 ;
		while(p&& j<i){
			p = p->next ;
			++j ; 
		}
		
		if(!p || j>i) return FALSE ;
		e = p->data ;
		return TRUE ;
} 

插入链表

Bool ListInsert_L (LinkList &L,int i , ElemType e){
	LinkList p ;
    LinkList s ;
	p = L ;
	int j = 0 ;
	while (p && j<i-1){
		p = p->next ;
		++j ;
	}
	
	if(!p || j> i-1) return FALSE ;
	s = (LinkList) malloc (sizeof(LNode)) ;
	s->data = e ;
	s->next = p->next ;
	p->next = s ;
	
	return TRUE ;
} 

删除链表

Bool ListDelete_L(LinkList &L ,int i ,ElemType &e){
		LinkList p ; 
		LinkList q ; 
		p = L ;
		int j = 0 ;
		while(p->next && j<i-1){
			p = p->next ;
			++j ;
		}
		
	if(! (p->next) || j>i-1 ) return FALSE ;
	q = p->next ;
	p->next= q->next ;
	e = q->data ;
	free(q) ;
	return TRUE ;	
} 

合并链表

void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){
	LinkList pa;
	LinkList pb ;
	LinkList pc ;
	
	pa = La->next ;
	pb = Lb->next ;
	Lc = pc =La ;
	
	while(pa && pb){
		if(pa->data <= pb->data){
			pc->next = pa ;
			pc = pa ;
			pa = pa->next ;
		} else {
			pc->next = pb ;
			pc = pb ;
			pb = pb->next ;
		}
	}
	pc -> next = pa ? pa : pb ;
	free(Lb) ; 
} 

主函数

int main(){
    ElemType e;
    ElemType elem;
	LinkList L ; 
	LinkList L1 ; 
	LinkList L2 ; 
	LinkList L3 ; 
	int num,num1,num2,num3 ;
	
	
	printf("1、创建链表
") ;
	if(!CreateList_L(L,5))
        printf("链表创建失败!
");
    else
        printf("链表创建成功!
");
	 //CreateList_L(L,5) ;
	printf("创建的链表表为
") ;
	print(L) ;
	
	printf("

") ;
	printf("2、链表的按位查找
") ;
	printf("请输入要查找的位序
") ;
	scanf("%d",&num) ; 
	GetElem_L(L,num,e) ;
	printf("

") ;
	printf("顺序表L1的第%d个元素是%d",num,e);
	
	printf("

") ;
	printf("3、链表的插入操作
") ;
	printf("请输入要插入的位序与元素") ;
	scanf("%d%d",&num1,&num2)  ;
	ListInsert_L(L,num2,num2) ;
	print(L) ;
	
	printf("

") ;
    printf("4、链表的删除操作
") ;
	printf("请输入要删除的位序") ;
	scanf("%d",&num3)  ;
	ListDelete_L(L ,num3 ,elem) ;
	printf("删除元素是%d
",elem);
	
	printf("

") ;
	printf("5、有序链表的合并开始") ;
	printf("

") ;
	printf("5.1、创建待合并的有序链表1
") ; 
	CreateList_L(L1,5) ;
	//print(L) ;
	printf("

") ;
	printf("有序链表1为
") ;
	print(L1) ;
	
	printf("

") ;
	printf("5.2、创建待合并的有序链表2
") ; 
	CreateList_L(L3,5) ;
	printf("有序链表2为
") ;
	print(L3) ;
	printf("

") ;
	MergeList_L(L3,L1,L2) ;
	printf("5.3、合并结果为
") ; 
	print(L2) ;
	

}

输出结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

原文地址:https://www.cnblogs.com/lzhCreate/p/13948263.html