本博文已修改,更好的阅读请见链接 ​​单链表的实现​​。


2.源代码

void insertDataTail(Node* &L){
int number;
printf("请输入需要插入的数据数目:\n");
scanf("%d",&number);
int i;
Node* q;//新建一个Node型指针q
Node* r;//用来遍历区间
r = L;//注意插入的时候,指针从L开始
while(r->next!=null){//当r不是尾指针的时候
r = r->next;//循环
}
for(i = 0;i< number;i++){
q = new Node ;//指向一个申请的节点
scanf("%d",&q->data);//输出数据
q->number = ++count; //表示结点的序号
r->next = q;//插入
q->next = null;//赋空
r = q; //换值
}
}

3.代码分析


  • (1)我们要清楚,在插入和删除操作中,我们均需要知道被操作的那个结点之前的那个结点,只有这样,才能准确无误地完成操作。要准确理解什么是“在被操作的那个结点之前的那个结点”,比如说,在上述的这个代码中insertDataTail()是实现尾插法插入数据到单链表中。而在这里的“前一结点”的思想的准确体现就是在while循环中的实现。
  • (2)链表插入三部曲:插入;赋空;换值。

Node* r;
r=L;

这里之所以是r=L;而不是r=L->next的原因就是插入(删除)思想的体现。【L指向的是头结点,我们需要的是在头结点之后插入首元结点,紧接着再往后面插入数据……】


3.链表的相关习题

3.1 实操案例1

读者如果理解了之后,可以尝试完成下面这道题

将一个带头结点的单链表A分解成两个链表A和B,使得A只含有奇数元素,链表B只含有偶数元素。这里给出源码

//Unit2-10 
void seperateTwoLinkList(Node* L,Node* &L1,Node* &L2){//将链表L修改成L1与L2
Node* r;
r = L;
Node* a;
Node* b;
a = L1;
b = L2;
while(r->next!=null){//r不动
if((r->next->number)%2==0){//如果为偶数
a->next = r->next;
r->next = r->next->next;
a->next->next = null;
a = a->next;
}
else{//奇数
b->next = r->next;
r->next = r->next->next;
b->next->next = null;
b = b->next;
}
}
}

  • (1)插入需要注意的地方就是指针当前的位置,指针的替换等。
  • (2)注意我们在申请两个Node型指针的时候,不能使用

Node* a,b;

方式来申请,而必须使用

Node* a;
Node* b;

或者是语句

Node *a,*b;

来申请两个Node*型指针,切记!!