单链表
用一组地址任意的存储单元存放线性表中的数据元素
数据域(数据元素)+指针域(指示后继元素的存储位置)=结点
以 “结点的序列” 表示线性表——称作链表
单链表基本操作及实现
查找
按位置查找
链表的操作只能通过从头指针出发,顺着链域next逐个结点比较,直到搜索到指定位置的结点为止
Status List_Retrieve(SqListPtr L, int pos, ElemType *elem)
{
Status s = range_error;
Ptr p = (*L)->next;
int i = 1;
while(p && i<pos){
i++;
p = p->next;
}
if(p && i==pos){
*elem = p->data;
s=success;
}
return s;
}
按值查找
1.初始化:p指针指向线性表第一个结点;位置i=1;操作状态s为错误
2.只要线性表不空,循环做下面操作
3.如果带查找数据==当前节点数据,则退出循环
4.否则p指针指向下一个结点;位置计算器i增1
5.循环外面判断p!=NULL,则找到数据,将位置i赋值给pos参数,修改操作状态s为成功
6.返回操作状态s
Status List_Locate(SqListPtr L, ElemType elem, int *pos)
{
Status s = range_error;
Ptr p = (*L)->next;
int i = 1;
while(p != NULL){
if(p->elem == elem)
break;
i++;
p = p->next;
}
if(p){
*pos = i;
s=success;
}
return s;
}
插入
Status List_Insert(SqListPtr L, int pos-1,ElemType elem)
{
Status status;
Ptr p,s;
status = List_Retrival(L, pos-1, &p);
if(status == success){
s = (LinkedPtr)malloc(sizeof(Node));
if(s){
s->elem = elem;
s->next = p->next;
p->next = s;
status = success;
}
else status = fatal;
}
else status = range_error;
return status;
}
删除
Status List_delete(SqListPtr L, int pos)
{
Status status = fail;
Ptr s,p;
status = List_Retrival(L, pos-1,&p);
if(status == success)
{
s = p->next;
p->next = s->next;
free(s);
s = NULL;
status = success;
}
return status;
}
创建
Status List_Create(SqListPtr L, ElemType data[], int len)
{
Status s;
Ptr p;
s= List_Init(L);
if(s == success){
for(int i = len-1; i>=0; --i){
p = (Ptr)malloc(sizeof(Node));
if(p){
p->elem = data[i];
p->next = (*L)->next;
(*L)->next = p;
}
else{
s = fail;
break;
}
}
}
return s;
}