总结下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);
}