线性表的链式存储及基本操作

只测试了大概的一部分,应该还存在bug。

//有头结点的链式存储的链表 
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct LNode *List;
struct LNode{
	ElementType Data;
	List Next;
};  
List MakeEmpty();
List Find(ElementType X,List L);
List FindKth(int K,List L);
bool Insert(ElementType X,int K,List L);
bool Delete(int K,List L);
int Length(List L);
bool Print(List L);
int main()
{
	List L;
	printf("测试Insert函数和Print函数:"); 
	L=MakeEmpty();
	for(int i=1;i<=10;i++){
		Insert(2*i,i,L);
	}
	Print(L);
	printf("测试Find函数:%d\n",Find(4,L)->Data);
	Find(5,L);
	printf("测试FindKth函数:%d\n",FindKth(5,L)->Data); 
	printf("测试Delete函数:"); 
	Delete(5,L);
	Print(L);
	printf("测试Length函数:%d",Length(L));
}
List MakeEmpty()
{
	List L;
	L=(List)malloc(sizeof(struct LNode));
	L->Next=NULL;
	return L;
}
List Find(ElementType X,List L)
{
	List Ptr=L->Next;
	while(Ptr&&Ptr->Data!=X)//这里不能改成Ptr->Data!=X &&Ptr;,因为Ptr为NULL时,Ptr->Data会报错 
		Ptr=Ptr->Next;
	if(Ptr==NULL)
		printf("未找到元素%d\n",X);
	return Ptr;
}
List FindKth(int K,List L)
{
	List Ptr=L->Next;
	int i=1;
	while(Ptr!=NULL&&K!=i){//这里若K>i,则下面不能return Ptr。要判断K与i是否相等 
		i++;
		Ptr=Ptr->Next;
	}
	return Ptr;
}
int Length(List L)
{
	int i=1;
	List Ptr=L->Next;
	while(Ptr)
	{
		i++;
		Ptr=Ptr->Next;
	}
	return i-1;
}
bool Insert(ElementType X,int K,List L)
{
	if(K<1||K>Length(L)+1){
		printf("插入的位序错误!\n");
		return false;
	}
	List Ptr=L;
	int i=1;
	while(K!=i){
		i++;
		Ptr=Ptr->Next; 
	}
	List LX=(List)malloc(sizeof(struct LNode));
	LX->Data=X;
	LX->Next=Ptr->Next;
	Ptr->Next=LX;
	return true;
}
bool Delete(int K,List L)
{
	if(K<1||K>Length(L)){
		printf("删除的位序错误!\n");
		return false;
	}	
	int i;
	List Ptr=L;
	while(i!=K)
	{
		i++;
		Ptr=Ptr->Next;
	} 
	List temPtr=Ptr->Next;
	Ptr->Next=Ptr->Next->Next;
	free(temPtr);
}
bool Print(List L)
{
	List Ptr=L->Next;
	if(Length(L)==0)
		printf("表空\n");
	for(int i=1;i<=Length(L);i++){
		printf("%d\t",Ptr->Data);
		Ptr=Ptr->Next;
	}
	printf("\n");
	
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值