链表和顺序表的不同在于,链表的数据元素之间的逻辑关系是由结点之间的指针完成的。逻辑上相邻两个元素之间的物理地址不同于顺序表,是不相邻的。
线性单链表的存储结构包括: 数据域和指针域(例如:p->data , p->next )
例:GetElem 函数在单链表中的实现,找到第i个元素:
//2020.7.24 飞飞飞 GetElem 单链表函数
Status GetElem_L(LinkList &L, int i , ElemType &e){
//首先让指针指向头节点的下一个元素
p = L -> next ;
j = 1 ;
while( p && j < i ){
p = p-> next ;
j++ ;
}
if(!p || j > i) return ERROR;
e = p -> data ;
return OK ;
}
觉得题目中的第i个元素就是指:如果头节点存在的话,“p指针指向 i” ;第i 个位置也是指针指向i . 这个问题总是要好好想一下,加不加1 的问题,太菜了。
第i个位置之前插入一个节点(实现代码)
//2020.7.24 飞飞飞 单链表插入函数
Status Insert_L (LinkList &L, int i , ElemType &e){
p = L ;
j = 0 ;
while(p && j < i - 1){
p = p -> next ;
j++ ;
} //找到第i个 位置前的元素
if (!p || j > i - 1) return ERROR ;
//先给插入的结点c 分配内存空间
s = (LinkList) malloc (sizeof(LNODE)) ;
s -> data = e ;
s -> next = p -> next ; // s的指针域指向p的指针域
p -> next = s ; //p 的指针域指向s
return OK ;
}
删除第i 个元素,并返回
//2020.7.24 飞飞飞 单链表删除结点函数
Status Delete_L (LinkList &L , int i , ElemType & e){
p = L -> next ;
j = 0 ;
//首先找到需要删除的结点的前一个结点
while(p && j < i - 1){
p = p -> next ;
j ++ ;
}
if(!p || j > i - 1) return ERROR ;
q = p -> next ; //在定义需要删除的结点
p -> next = q -> next ;
e = q -> data ;
free(q) ; // 释放q空间
return OK ;
}
算法:将两个有序的链表合成一个链表
// 2020.7.24 飞飞飞 MergetList() 单链表函数
void Mergelist_L (LinkList &LA ,LinkList &LB ,LinkList &LC){
pa = LA -> next ;
pb = LB -> next ;
pc = LC = LA ; //定义指针
while(pa && pb) {
if(pa -> data > pb -> data){
pc -> next = pb;
pc = pb;
pb = pb - > next ;
} else
{
pc -> next = pa ;
pc = pa ;
pa = pa -> next ;
}
pc -> next = pa ? pa :pb ;//" ? : " 运算符 :如果pa为真 ,表达式的值为pa,如果pa为假,表达式值为pb
free(Lb) ;
}
}