上次,我们学习了线性表的顺序存储结构,现在,我们再来看下线性表的链式存储结构,相比于顺序存储,链式存储结构在插入、删除等操作上降低了时间复杂度,但是在提取、求直接前驱和直接后继等操作上、没有线性表那么方便,这就需要我们必须熟练的掌握这两种存储方式,接下来,我们来看下链式存储结构的基本操作的实现
Status List_Init(SqListPtr L)
{
Status s = fail;
if(*L == NULL)
{
Ptr p = (Ptr)malloc(sizeof(Node));
if(p == NULL)
return s;
*L = p;
(*L)->next = NULL;
s = success;
}
return s;
}
void List_Destroy(SqListPtr L)
{
List_Clear(L);
if(*L)
{
free(*L);
*L = NULL;
}
}
void List_Clear(SqListPtr L)
{
Ptr p;
if(*L)
{
p = (*L)->next;
while(p)
{
(*L)->next = p->next;
free(p);
p = (*L)->next;
};
}
}
bool List_Empty(SqListPtr L)
{
return ((*L)->next == NULL);
}
int List_Size(SqListPtr L)
{
int len = 0;
Ptr p = (*L)->next;
while(p)
{
len++;
p = p->next;
}
return len;
}
Status List_Retrival(SqListPtr L,int pos,ElemType * elem)
{
Status s= rang_error;
int i=1;
Ptr p= (*L)->next;
while(p && i<pos)
{
i++;
p = p->next;
}
if(p && i==pos)
{
*elem = p->elem;
s = success;
}
return s;
}
Status List_Locate(SqListPtr L,ElemType elem,int *pos)
{
Status s = fail;
Ptr p = (*L)->next;
int i=1;
while(p)
{
if(p->elem == elem)
{
s = success;
*pos = i;
break;
}
i++;
p = p->next;
}
return s;
}
Status List_Find(SqListPtr L,int pos, SqListPtr pAddr)
{
int i=1;
Status s = fail;
Ptr p = (*L)->next,q = (*L);
while(i <= pos && p) //始终使得q指向p的直接前驱
{
q = p;
p = p->next;
i++;
}
if(i == pos+1 && q)///*********************************
{
(*pAddr) = q;
s = success;
}
return s;
}
Status List_Insert(SqListPtr L,int pos,ElemType elem)
{
Status s = fail;
Ptr p,q;
/*Ptr p = (*L)->next,q = (*L);
while(i < pos && p) //始终使得q指向p的直接前驱
{
q = p;
p = p->next;
i++;
}
if(i == pos && p)
{
p = (Ptr)malloc(sizeof(Node));
p->elem = elem;
q->next = p;
s = success;
}*/
if(pos>1)
{
s = List_Find(L,pos-1,&q);
if(s == success)
{
p = (Ptr)malloc(sizeof(Node));
if(p)
{
p->elem = elem;
p->next = q->next;
q->next = p;
s = success;
}
}
}
else
{
p = (Ptr)malloc(sizeof(Node));
if(p)
{
p->elem = elem;
p->next = (*L)->next;
(*L)->next = p;
s = success;
}
}
return s;
}
Status List_delete(SqListPtr L,int pos)
{
Status s = fail;
Ptr p,q;
/*
Ptr p = (*L)->next,q = (*L);
while(i<pos && p)
{
i++;
q = p;
p = p->next;
}
if(i == pos && p)
{
q->next = p->next;
free(p);
p = NULL;
}*/
s = List_Find(L,pos-1,&q);
if(s == success)
{
p = q->next;
if(p)
{
q->next = p->next;
free(p);
p = NULL;
s = success;
}
}
return s;
}
Status List_Prior(SqListPtr L,int pos,ElemType * elem)
{
Status s;
Ptr q;
s = List_Find(L,pos-1,&q);
if(s == success)
{
*elem = q->elem;
s = success;
}
return s;
}
Status List_Next(SqListPtr L,int pos,ElemType * elem)
{
Status s;
Ptr q;
s = List_Find(L,pos,&q);
if(s == success)
{
if(q->next)
{
*elem = q->next->elem;
s = success;
}
else
{
s = fail;
}
}
return s;
}
void List_Print(SqListPtr L)
{
Ptr p =(*L)->next;
int i=1;
while(p)
{
printf("%d,",p->elem);
p = p->next;
if(i++%10 == 0)
printf("\n");
}
}
大家可以就这两种存储方式做相互对照,如有问题,可以私信给我哦!