1、单链表的读取:
获取链表第i个数据的算法思路:
1、声明一个结点p指向链表的第一个结点,初始化j从1开始;
2、当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,i累加1;
3、若到链表末尾p为空,则说明第i个元素不存在;
4、否则查找成功,返回结点p的数据。
实现代码:
/*初始条件:顺序线性表L已存在,1<=i<=ListLength(L)*/
/*操作结果:用e返回L中第i个数据元素的值*/
Status GetElem(LinkList L,int i,ElemType *e)
{
int j;
LinkList p; /*声明一结点p*/
p = L->next; /*让p指向链表L的第一个结点*/
j = 1; /*j为计数器*/
while(p && j < i) /*p不为空或者计数器j还没有等于i时,循环继续*/
{
p = p->next; /*让p指向下一个结点*/
++j;
}
if(!p || j>i)
{
return ERROR; /*第i个元素不存在*/
}
*e = p->data; /*取第i个元素的数据*/
return OK;
}
最坏情况的时间复杂度是O(n)
2、单链表的插入与删除
单链表的插入:
思路:
1、声明一结点p指向链表第一个结点,初始化j从1开始;
2、当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1;
3、若到链表末尾p为空,则说明第i个元素不存在;
4、否则查找成功,在系统中生成一个空结点s;
5、将数据元素e赋值给s->data;
6、单链表的插入标准语句s->next = p->next;p->next = s;
7、返回成功
实现代码:
/*初始条件:顺序线性表L已经存在,1<=i<=ListLength(L)*/
/*操作结果:在L中第i个位置之前的插入数据元素e,L的长度加1*/
Status ListInsert(LinkList *L,int i,ElemType e)
{
int j;
LinkList p,s;
p = *L;
j = 1;
while(p && j < i) /*寻找第i个结点*/
{
p = p->next;
++j;
}
if(!p || j > i)
{
return ERROR; /*第i个元素不存在*/
}
s = (LinkList)malloc(sizeof(Node)); /*生成新结点*/
s->data = e;
s->next = p->next; /*将p的后继结点赋值给s的后继*/
p->next = s; /*将s赋值给p的后继*/
return OK;
}
单链表的删除:
思路:
1、声明一结点p指向链表第一个结点,初始化j从1开始;
2、当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1;
3、若到链表末尾p为空,则说明第i个元素不存在;
4、否则查找成功,将欲删除的结点p->next赋值给q;
5、单链表的删除标准语句p->next = q->next;
6、将q结点中的数据赋值给e,作为返回;
7、释放q结点;
8、返回成功。
实现代码:
/*初始条件:顺序线性表L已经存在,1<=i<=ListLength(L)*/
/*操作结果:删除在L中第i个位置之前的数据元素e,L的长度减1*/
Status ListDelete(LinkList *L,int i,ElemType e)
{
int j;
LinkList p,s;
p = *L;
j = 1;
while(p && j < i) /*寻找第i个结点*/
{
p = p->next;
++j;
}
if(!p || j > i)
{
return ERROR; /*第i个元素不存在*/
}
s = (LinkList)malloc(sizeof(Node)); /*生成新结点*/
q = p->next;
p->next = q->next; /*将q的后继结点赋值给p的后继*/
*e = q->data; /*将q结点中的数据给e*/
free(q); /*让系统回收此结点,释放内存*/
return OK;
}