链表操作之插入数据


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


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*型指针,切记!!

 

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

说文科技

看书人不妨赏个酒钱?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值