C语言中的 单链表建立、测长与输出检测

总结下C语言中链表的基本使用规则,也算是自己的一个总结咯;

一句话先置顶:单链表指针所指向的是1个节点;想高级一点的话可以仿照《C和指针》中的获取当前节点的link字段的地址从而可以直接指向节点内部的link字段。

NOTE:以后涉及到了单链表的插入时,一定牢记一点:newnode其实就是想插到previous和current之间!两句话其实可以实现:

new->link=current;
previous->linkl=new;

下面用图来详细说明下,链表的建立:


NOTE:如上图所示,刚开始初始化的previous并没有指向任何节点,因为你没给他说要指向哪个节点啊!所以才有了程序里面的下面这句话

	previous=head;
这句话之后呢,你的previous指针就不会到处流浪啦,就能够正经地指向链表了,就是类似于下面的这幅图咯,一个一个一个的按照链表移动;


说一下写程序遇到的一个有意思的程序吧:在“链表测长”程序中,以下两句程序差距还是很大的,下面简单分析下

【1】	node *previous= head->next;
【2】	node *previous;
        previous = head;
第【1】个程序中,声明previous指针,且指向(head指针指向的节点的link字段指向的下一个节点!!指向的是下一个节点;

        第【2】个程序中,声明previous指针,且指向的节点信息和head一样哦;

总体感觉还是第1个用起来还用,下面给出完整版的亲测能用的代码哦。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<conio.h>
using namespace std;

typedef struct student{
	int data;
	struct student *next;
}node;

/*函数功能:创建链表(手动输入整数型数字,并以0结束)
  NOTE:	previous=head;函数开始执行时,对previous进行赋值操作,使其向前移动1个节点
  */
node *creat(){
	node *previous= NULL,*head= NULL,*datesave= NULL;
	int Enable_cycle=1,Input_date=0;
	head = (node*)malloc(sizeof(node));
	previous=head;
	printf("\Input YOUR Date:\n");
	while(Enable_cycle)
	{
		scanf("%d",&Input_date);
		
		if(Input_date!=0){
			datesave = (node *)malloc(sizeof(node));
			
			datesave->data = Input_date;
			previous->next = datesave;
			previous = datesave;	
		}
		else{
			Enable_cycle=0;	
		}		
	}
		previous->next = NULL;  
	    return(head); 		
}

/*统计链表长度 
	NOTE:	previous = head->next; previous指向(head指针指向的下一个节点),能够有效地统计指针长度(相比previous = head而言)
	*/
int Get_lenth(node *head){
	int num=0;
	node *previous= head->next;
//	previous = head->next;
	while(previous!=NULL)
	{
		previous = previous->next;
		num++;
	}
	return(num);

}
/*输出链表信息
	NOTE:	previous = head->next; previous指向(head指针指向的下一个节点),能够有效地统计指针长度(相比previous = head而言)
	当指针指向的节点中的link字段 不为NULL指针时	
*/
void Output(node *head){
	int Show_length=0;
	node *previous= head->next;
	Show_length=Get_lenth(head);
	printf("\nLength:%d",Show_length);
		
//	previous = head->next;
	printf("\nOUT   :");
	while(previous!=NULL)
	{
		printf("%d ",previous->data);
		previous = previous->next;
	}
}

int main()
{
	node *HEAD = NULL;
	HEAD = creat();  

	Output(HEAD);  	
}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值