#include <stdio.h>
#include <malloc.h>
typedef struct LNode *List;
struct LNode{
int Data;
List Next;
};
struct LNode L;
List PtrL;
/*用链表遍历的方法求表长,时间复杂度为O(n)*/
int Length(List PtrL)
{
List p=PtrL;//p指向表的第一个结点
int j=0;
while(p){
p=p->Next;//当前p指的是第j个结点
j++;
}
return j;
}
/*按序号查找*/
List FindKth(int K,List PtrL)
{
List p=PtrL;
int i=1;
while(p!=NULL&&i<K){
p=p->Next;
i++;
}
if(i=K)
return p;
else
return NULL;
}
/*按值查找*/
List Find(int X,List PtrL)
{
List p=PtrL;
while(p!=NULL&&p->Data!=X){
p=p->Next;
}
return p;
}
/*插入操作,平均查找次数n/2*/
List Insert(int X,int i,List PtrL)
{
List p,s;
if(i==1){ //新结点插在表头
s=(List)malloc(sizeof(struct LNode)); //申请、填装表头
s->Data=X;
s->Next=PtrL;
return s; //返回新表头指针
}
p=FindKth(i-1,PtrL);//查找第i-1个结点
if(p=NULL){ //第i-1个结点不存在,不能插入
printf("参数错误");
return NULL;
} else{
s=(List)malloc(sizeof(struct LNode)); //申请,填装结点
s->Data=X;
s->Next=p->Next; //新结点插入在第i-1个结点后面
p->Next=s;
return PtrL;
}
}
/*删除操作*/
List Delete(int i,List PtrL)
{
List p,s;
if(i==1){ //如果要删除的是第一个结点
s=PtrL; //s指向第一个结点
if(PtrL!=NULL) //从链表中删除
PtrL=PtrL->Next;
else
return NULL;
}
p=FindKth(i-1,PtrL); //查找第i-1个结点
if(p==NULL){
printf("第%d个结点不存在",i-1);
return NULL;
}else if(p->Next==NULL){
printf("第%d个结点不存在",i);
return NULL;
}else{
s=p->Next; //s指向第i个结点
p->Next=s->Next; //从链表中删除
free(s); //释放被删除的结点
return PtrL;
}
}
/*输出整个顺序表*/
void ListTraverse(List PtrL)
{
List p;
p=PtrL;
while(p)
{
printf("%5d",p->Data);
p=p->Next;
}
return;
}
int main()
{
return 0;
}
链表
最新推荐文章于 2022-03-25 18:01:21 发布