【C语言】单链表的初始化,创建和输出

        链表主要分为四种:单向链表,双向链表,单向循环链表,双向循环链表。这里的单链表默认为单项非循环链表。

        要确定一个数组,需要知道两个参数,一个是数组名,即数组首元素地址,另一个是数组元素个数。而要确定一个单链表,只需要知道头指针,因为头指针指向头结点,头结点存放首结点的地址,首结点存放下一个结点的地址,······,直到最后一个结点。

        所以单链表的初始化就是创建一个头指针,指向头结点,而头结点的指针域为空,表示空单链表。

        单链表的创建可以分为两种方法:一是在单链表的尾部插入新结点,即数据读入顺序和结点顺序完全相同,称为尾插法,二是在单链表的头部插入新结点,即数据读入顺序与结点顺序完全相反,称为头插法。

                尾插法是从一个空链表开始,重复读入数据,生成新结点,将数据放入新结点的数据域中,然后将新结点插入到当前链表的尾部,直到读入结束标志为止。注意:因为尾结点一直在变化,所以我们增加一个指针 move 来始终指向尾结点,以便新结点的插入。

                头插法是从一个空链表开始,重复读入数据,生成新结点,将数据放入新结点的数据域中,然后将新结点插入到当前链表的头部,直到读入结束标志为止。注意:链表其实是从首结点开始的,因为头结点的数据域中不放数据,所以新结点插入到首结点的位置。

        单链表的输出即单链表中各数据的遍历。需要定义一个临时指针来进行循环操作。

        将各部分模块化,即写成函数,在主调函数中调用即可。

#include
#include

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

//单链表的初始化,即创建一个头指针或者说头结点,因为头指针指向头结点-------------------------
Node* List()
{
	Node* head =(Node*)malloc(sizeof(Node));//head是头指针,指向头结点 
	head->next =NULL;                       //头结点的指针域为空,即首结点的地址为空
	return head;                            //返回头指针,因为只要确定了头指针,就确定了一个链表 
}

//尾插法创建单链表------------------------------------------------------------------------
void CreatByRear(Node* head)
{
	Node* move =head;//目的是让头结点一直不动,move一直指向尾结点 
	Node* newnode;   //指向新结点 
	int data;
	
	printf("请输入数字(输入 -1 代表结束):");
	while (1)
	{
		scanf("%d",&data);
		if (-1==data)
			break;
		else
		{
			newnode       =(Node*)malloc(sizeof(Node));
			newnode->data =data;
			move->next    =newnode;
			move          =newnode;
		}
	}
	move->next =NULL;//因为move一直指向尾结点,而尾结点的指针域为空 
} 

//头插法创建单链表------------------------------------------------------------------------
void CreatByHead(Node* head)
{
	Node* newnode;//指向新结点
	int data;
	
	printf("请输入数字(输入 -1 代表结束):");
	while (1)
	{
		scanf("%d",&data);
		if (-1==data)
			break;
		else
		{
			newnode       =(Node*)malloc(sizeof(Node));
			newnode->data =data;
			newnode->next =head->next ;//先让新结点的指针域存放原来首结点的地址 
			head->next    =newnode;    //再让新结点成为首结点 	
		}
	}
} 

//输出链表-------------------------------------------------------------------------------
void Output(Node* head)
{
	Node* tempnode;      //循环时所用的临时指针 
	tempnode=head->next ;//临时指针从首结点开始移动 
	while (tempnode)
	{
		printf("%d ",tempnode->data );
		tempnode=tempnode->next ;
	}
	printf("\n");
}
//主函数---------------------------------------------------------------------------------
int main(void)
{
	Node* head1;         //定义尾插法建立的单链表头指针 
	Node* head2;         //定义头插法建立的单链表头指针 

	head1=List();        //初始化单链表 
	CreatByRear(head1);  //尾插法创建单链表
	Output(head1);       //输出单链表 
	
	head2=List();        //初始化单链表 
	CreatByHead(head2);  //头插法创建单链表
	Output(head2);       //输出单链表
	
	return 0;
}

你可能感兴趣的:(c语言,算法,开发语言)