只测试了大概的一部分,应该还存在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");
}