C语言从零开始之数据结构与算法单链线性表基本操作(2)

本文介绍了使用C语言实现线性链表的基本操作,包括初始化、创建、打印、销毁、清空、获取指定位置元素、插入、删除等,并提供了相应的函数实现和示例代码。此外,还涉及到了线性链表的排序和查找功能。
摘要由CSDN通过智能技术生成
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/**************************************************************************/
/* 抽象数据类型线性表基本操作*/
/* 1.InitLinkList函数,初始化线性表,创建表头指针并置为NULL*/
/* 2.CreateLinkList函数,创建线性表,此函数输入为负数则停止输入*/
/* 3.PrintLinkList函数,遍历输出线性表*/
/* 4.DestroyLinkList函数,销毁线性表释放内存空间*/
/* 5.ClearLinkListt函数,清空线性表释放内存空间*/
/* 6.GetElemLinkList函数,返回线性链表第i个元素*/
/* 10.InsertLinkList函数,插入线性表*/
/* 11.InsertFirst函数,向单链表的表头插入一个元素 */
/* 12.InserLast函数,向单链表的末尾添加一个元素 */
/* 13.DeleteLinkList,删除链表第i个元素 */
/* 14.DeleteFisrt,删除链表第1个元素 */
/* 15.DeleteLast,删除链表最后一个元素 */
/* 16.SortLinkList函数,升序*/
/* 17.SortedLinkList函数,降序*/
/* 18.MergeLinkList函数,合并L1和L2*/
/* 19.CopyLinkList函数,合并L1和L2*/
/* 20.SearchLinkList函数,查找元素e是否在链表中,返回索引值*/
/**************************************************************************/
#define OK 1
#define	ERROR 0
typedef int	ElemType;
typedef struct LNode{
	ElemType elem;
	struct LNode *next;
}LNode,*LinkList;

/***************************初始化线性链表***********************************/
int InitLinkList(LinkList *L){	//创建头指针
	*L=(LinkList)malloc(sizeof(LNode));
	if(!L){
		printf("内存分配失败,初始化失败!\n");
		return ERROR;
	}
	(*L)->next=NULL;
	return OK;
}

/***************************构建线性链表***********************************/
int CreateLinkList(LinkList L){
	LinkList L1;			//用次变量创建新链表节点
	LinkList L2;			//用次遍历递归连接插入新节点
	ElemType elem;			//接收输入数据

	L2=L;
	printf("请输入数据:");
	scanf("%d",&elem);
	getchar();				//接收缓存中的回车键
	while(elem>0){			//输入大于0有效
		L1=(LinkList)malloc(sizeof(LNode));
		if(!L1){
			printf("内存分配失败,构建链表失败!\n");
			return ERROR;
		}	
		L1->elem=elem;
		L1->next=NULL;
		L2->next=L1;
		L2=L1;
		printf("请输入数据:");
		scanf("%d",&elem);
		getchar();				//接收缓存中的回车键
	}
	return OK;
}
		
/***************************打印线性链表***********************************/
int PrintLinkList(LinkList L){
	if(L==NULL){
		printf("LinkList is NULL!\n");
		return ERROR;
	}
	if(L->next == NULL){
		printf("链表为空表!\n");
		return ERROR;
	}
	L=L->next;
	printf("打印链表元素: ");
	while(L != NULL){
		printf("--%d--",L->elem);
		//printf("--%x--",L);
		L=L->next;
	}
	printf("\n");
	printf("链表元素打印完毕!\n");
	return OK;
}

/***************************销毁线性链表***********************************/
int DestroyLinkList(LinkList *L){
	LinkList L1;
	LinkList L2;
	L1=*L;
	while(L1 != NULL){
		L2=L1->next;
		free(L1);
		L1=NULL;
		L1=L2;
	}
	free(*L);
	*L=NULL;
	return OK;
}
/***************************清空线性链表***********************************/
int ClearLinkListt(LinkList L){
	LinkList L1;
	LinkList L2;
	L1=L;
	while(L1 != NULL){
		L2=L1->next;
		free(L1);
		L1=NULL;
		L1=L2;
	}
	L->next=NULL;
	return OK;
}

/***************************返回线性链表第i个元素**************************/
ElemType GetElemLinkList(const LNode *L,int i){
	if(i<0){
		printf("下标越界,返回失败!\n");
		return ERROR;
	}
	LNode *L1;
	ElemType e;
	L1=L->next;
	for(int j=0;j!=i;j++){
		if(L1 == NULL){	//遍历到第i个元素之前已经到达链表终点,下标越界,返回错误
			printf("下标超界,返回失败!\n");			
			return ERROR;
		}
		L1=L1->next;
	}
	e=L1->elem;
	return e;
}

/***************************在第i个位置插入元素e**************************/
ElemType InsertLinkList(LinkList L,int i,ElemType e){						//L2作为新建链表节点,因为L不能改变,L1作为L2连接到L的中间人,	
	LinkList L1;
	LinkList L2;
	if(i<0){
		printf("下标越界,插入失败!\n");
		return ERROR;
	}
	L1=L;
	for(int j=0;j != i;j++){
		if(L1 == NULL){	//遍历到第i个元素之前已经到达链表终点,下标越界,返回错误
			printf("下标超界,返回失败!\n");			
			return ERROR;
		}
		L1=L1->next;
	}
	L2=(LinkList)malloc(sizeof(LNode));
	if(!L2){
		printf("内存分配失败!\n");
		return ERROR;
	}
	L2->elem=e;
	L2->next=L1->next;
	L1->next=L2;
	return e;
}

/***************************在表头位置插入元素e**************************/
ElemType InsertFirst(LinkList L,ElemType e){				
	LinkList L1;
	LinkList L2;
	L1=L;
	L2=(LinkList)malloc(sizeof(LNode));
	if(!L2){
		printf("内存分配失败!\n");
		return ERROR;
	}
	L2->elem=e;
	L2->next=L1->next;
	L1->next=L2;
	return e;
}

/***************************在表尾位置插入元素e**************************/
ElemType InsertLast(LinkList L,ElemType e){
	LinkList L1;
	LinkList L2;
	L1=L;
	//for(int i=0; L1->next !=NULL;i++){
	while(L1->next != NULL){
		L1=L1->next;
	}
	L2=(LinkList)malloc(sizeof(LNode));
	if(!L2){
		printf("内存分配失败!\n");
		return ERROR;
	}
	L2->elem=e;
	L2->next=L1->next;
	L1->next=L2;
	return e;
}

/***************************删除第i个元素**************************/
ElemType DeleteLinkList(LinkList L,int i){
	LinkList L1;
	LinkList L2;
	ElemType e;
	L1=L;
	if(i<0){
		printf("下标越界,删除失败!\n");
		return ERROR;
	}
	for(int j=0;j!=i;j++){
		if(L1 == NULL){	//遍历到第i个元素之前已经到达链表终点,下标越界,返回错误
			printf("下标超界,删除失败!\n");			
			return ERROR;
		}
		L1=L1->next;
	}
	L2=L1->next;
	L1->next=L2->next;
	e=L2->elem;
	free(L2);
	L2=NULL;
	return e;
}

/***************************删除第1个元素**************************/
ElemType DeleteFisrt(LinkList L){
	LinkList L1;
	ElemType e;

	L1=L->next;
	L->next=L1->next;
	e=L1->elem;
	free(L1);
	L1=NULL;
	return e;
}

/***************************删除最后一个元素**************************/
ElemType DeleteLast(LinkList L){
	LinkList L1;
	LinkList L2;
	ElemType e;
	L1=L2=L;
	//for(int j=0;L1->next != NULL;j++){
	while(L2->next != NULL){
		L1=L2;
		L2=L1->next;
	}
	L1->next=NULL;
	e=L2->elem;
	free(L2);
	L2=NULL;
	return e;
}

/***************************升序**************************/
int SortLinkList(LinkList L){
	LinkList L1;
	LinkList L2;
	L1=L2=L->next;
	while(L1!=NULL){
		L2=L1->next;
		while(L2 != NULL){
			if(L2->elem<L1->elem){
				L1->elem=L1->elem^L2->elem;
				L2->elem=L1->elem^L2->elem;
				L1->elem=L1->elem^L2->elem;
			}
			L2=L2->next;
		}
		L1=L1->next;
	}
	return OK;
}

/***************************降序**************************/
int SortedLinkList(LinkList L){
	LinkList L1;
	LinkList L2;
	L1=L2=L->next;
	while(L1!=NULL){
		L2=L1->next;
		while(L2 != NULL){
			if(L2->elem>L1->elem){
				L1->elem=L1->elem^L2->elem;
				L2->elem=L1->elem^L2->elem;
				L1->elem=L1->elem^L2->elem;
			}
			L2=L2->next;
		}
		L1=L1->next;
	}
	return OK;
}

/***************************合并两个线性表**************************/
LinkList MergeLinkList(LinkList *L1,LinkList *L2){
	LinkList L3;
	L3=*L1;
	while((*L1)->next!= NULL){
		(*L1)=(*L1)->next;
	}
	(*L1)->next=(*L2)->next;
	*L1=NULL;
	free(*L2);
	*L2=NULL;
	return L3;
}

/***************************深拷贝一个链表**************************/

LNode *CopyLNode(LNode L){
	LNode *L_copy;
	L_copy=(LNode *)malloc(sizeof(LNode));
	if(!L_copy){
		printf("内存分配失败!\n");
		return L_copy;
	}
	L_copy->elem=L.elem;
	L_copy->next=NULL;
	return L_copy;
}


LinkList CopyLinkList(LinkList L){
	LinkList L_copy;
	LinkList L1;
	LinkList L2;
	InitLinkList(&L_copy);
	L2=L_copy;
	L=L->next;
	while(L != NULL){
		L1=CopyLNode(*L);
		L2->next=L1;
		L2=L1;
		L=L->next;
	}
	return L_copy;
}

/**************************查找元素e,返回索引值**************************/
int SearchLinkList(LinkList L,ElemType e){
	int i=0;

	L=L->next;
	while(L != NULL){
		if(e == L->elem){
			printf("%d在链表第%d个元素!\n",e,i);
			return i;
		}
		i++;
		L=L->next;
	}
	printf("e元素不在链表中!\n");
	return ERROR;
}

int main()
{
	LinkList L;
	LinkList L1,L2,L3;
	int i;
	ElemType e;
	int a[] = {1504,3,42,42,8,183,22,238,85,18,22,18,31};
	time_t t;

	printf("L_adr=%x\n",L);
	InitLinkList(&L);
	InitLinkList(&L1);
	InitLinkList(&L2);
	//CreateLinkList(L);
	//PrintLinkList(L);
	//DestroyLinkList(&L);
	//ClearLinkListt(L);
	//PrintLinkList(L);
	//printf("L_adr=%x\n",L);
	for(i=0;i<(sizeof(a)/sizeof(int));i++){
		int cnt=rand()%(i+1);
		//InsertLinkList(L,cnt,a[i]);
		//InsertFirst(L,a[i]);
		InsertLast(L,a[i]);
		PrintLinkList(L);
		SortLinkList(L);
		PrintLinkList(L);
	}
	for(i=0;i<10;i++){
		SearchLinkList(L,33);
	}
/*	srand(6);
	for(i=0;i<(sizeof(a)/sizeof(int));i++){
		int cnt=rand()%(i+1);
		InsertLinkList(L1,cnt,a[i]);
	}
	//PrintLinkList(L1);

	srand(600);
	for(i=0;i<(sizeof(a)/sizeof(int));i++){
		int cnt=rand()%(i+1);
		InsertLinkList(L2,cnt,a[i]);
	}
//	PrintLinkList(L2);
	//L3=L2;
	L3=CopyLinkList(L2);
	PrintLinkList(L2);
	PrintLinkList(L3);
	ClearLinkListt(L3);
	PrintLinkList(L2);
	PrintLinkList(L3);*/
	
	/*L3=MergeLinkList(&L1,&L2);
	printf("test1\n");
	PrintLinkList(L1);
	printf("test1\n");
	PrintLinkList(L2);
	printf("test1\n");
	PrintLinkList(L3);*/
	/*for(i=(sizeof(a)/sizeof(int))-1;i>=0;i--){
		int cnt=rand()%(i+1);
		//ElemType e=GetElemLinkList(L,cnt);
		//e=DeleteLinkList(L,cnt);
		//e=DeleteFisrt(L);
		e=DeleteLast(L);
		printf("L[%d]=%d\n",cnt,e);
		PrintLinkList(L);
	}*/
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值