链表操作之插入数据

来源:互联网 发布:淘宝客服与买家对话 编辑:程序博客网 时间:2024/06/05 02:42

1.现在来谈一下链表的插入操作

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)我们要清楚,在插入和删除操作中,我们均需要知道被操作的那个结点之前的那个结点,只有这样,才能准确无误地完成操作。

(2)要准确理解什么是“在被操作的那个结点之前的那个结点”,比如说,在上述的这个代码中insertDataTail()是实现尾插法插入数据到单链表中。而在这里的“前一结点”的思想的准确体现就是在

(3)链表插入三部曲:插入;赋空;换值。

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

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

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

//Unit2-10 void seperateTwoLinkList(Node* L,Node* &L1,Node* &L2){//将链表L修改成L1与L2Node* 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*型指针,切记!!


1 0
原创粉丝点击