(一)不带头节点的单向链表:
链表插入:
struct node{
int data;
node *next;
};
bool insertLinkList(node **head,int pos,int value){//向头指针为head的链表中pos位置处插入值为value的节点
if(pos < 0)//位置判定
return false;
node *ele = new node();
if(!ele)//总是在分配完内存后,检验内存是否分配成功
return false;
ele -> data = value;
if(!(*head) || pos == 0){//如果是空链表或者是在表头插入,需要修改head的值
ele -> next = *head;//先连
*head = ele;//后断
return true;
}
node *p = *head;
int j = 0;
while(j < (pos-1) && p){//p指向pos-1处的节点
j++;
p = p->next;
}
if(!p)
return false;
ele -> next = p ->next;
p -> next = ele;
return true;
}
测试:
node *head = NULL;//init head
insertLinkList(&head,1,2);//成功插入
insertLinkList(&head,3,2);//超过表长度,插入不成功
insertLinkList(&head,1,2);//成功插入
(二)带头节点的单向链表:
大部分情况下是此类链表,好处:统一了第一位置和其他位置的操作
bool insertLLHeadnode(node *head,int pos,int value){//头节点不算真正的元素节点,pos实际上从第二个节点开始计数,从0开始
if(pos < 0)
return false;
node *p = head;
int j = 0;
while(j < pos && p){
j++;
p = p->next;
}
if(!p)
return false;
node *ele = new node();
if(!ele)
return false;
ele -> data = value;
ele -> next = p ->next;
p -> next = ele;
return true;
}
测试:
node *head = new node();//init head
head->next = NULL;
insertLLHeadnode(head,0,1);
insertLLHeadnode(head,1,2);
insertLLHeadnode(head,2,3);
insertLLHeadnode(head,4,3);
insertLLHeadnode(head,3,11);
viewAllElements(head);
输出:
1 2 3 11