链式存储定义及基本操作
定义形式
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
初始化
Status InitList(LinkList L)
{
L=(LinkList)malloc(sizeof(LNode));
if(!L)
return ERROR;
L->next=NULL;
return OK;
}
销毁单链表
Status DestroyList(LinkList L)
{
LinkList p;
while(L)
{
p=L->next;
free(L);
L=p;
}
return OK;
}
置为空链表
Status ClearList(LinkList L)
{
LinkList p=L->next;
LinkList q;
while(p)
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;
return OK;
}
判断链表元素个数
int ListLength(LinkList L)
{
LinkList p=L->next;
int i=0;
while(p)
{
i++;
p=p->next;
}
return i;
}
获取链表元素
Status GetElem(LinkList L,int i,ElemType *e)
{
if(i<1) return ERROR;
int j=1;
LinkList p=L->next;
while(j<i&&p)
{
p=p->next;
j++;
}
if(!p) return ERROR;
else
{
*e=p->data;
return OK;
}
}
获取链表元素位置
Status LocateElem(LinkList L,ElemType e)
{
LinkList p=L->next;
int i=1;
while(p)
{
if(p->data==e)
return i;
else
{
p=p->next;
i++;
}
}
return 0;
}
插入元素
Status ListInsert(LinkList L,int i,ElemType e)
{
if(i<1) return ERROR;
int j=0;
LinkList p=L;
while(j<i-1&&p)
{
p=p->next;
j++;
}
if(!p) return ERROR;
LinkList q=(LinkList)malloc(sizeof(LNode));
q->data=e;
q->next=p->next;
p->next=q;
return OK;
}
删除元素
Status ListDelete(LinkList L,int i,ElemType *e)
{
if(i<1) return ERROR;
int j=1;
LinkList p=L->next,q;
while(j<i&&p)
{
q=p;
p=p->next;
j++;
}
if(!p) return ERROR;
*e=p->data;
q->next=p->next;
free(p);
return OK;
}
链表的优缺点
- 优点:数据元素的个数可以自由扩充;插入、删除等操作不必移动数据,只需修改指针,修改效率高。
- 缺点:存储密度小;存取效率不高,必须采用顺序存取,即存取数据元素时只能按链表的顺序进行访问。