单向循环链表的创建(C语言)

建议想学懂以下内容的新手小白先弄懂结构体,想完成老师作业的直接翻到最后面,有完整代码

1.链表结构体的创建

//装节点的的模具 
typedef struct list{
	int num;
	struct list *next;
}list;

 2.创建头节点函数,有头有链表

//头节点的初始化(有头有链表)(调用此函数既有头) 
list *list_init(void)//创建不需要任何返回参数,需要返回已经创建好的头节点地址 
{
	list *head = (list *)malloc(sizeof(list));
	if(head == NULL)
	{
		printf("申请内存失败\n");
		return NULL; 
	}
	//头节点已经存在,但没数据 
	head->num=0;
	head->next=head;//循环列表的指针指向自己 
	//返回!返回! 
	return head; 
}

3. 创建新节点

//创建新节点,既将数据放进一个结构体中
list *node_init(int data)//参数为要传入的数据 
{
	list *node = (list *)malloc(sizeof(list));
	if(node == NULL)
	{
		printf("申请内存失败\n");
		return NULL; 
	}
	//数据!数据!
	node->num = data;
	node->next=NULL;
	//返回!返回! 
	return node;
}

4.展示函数

//展示函数,需要你的head(有头有链表),给你看看就行,不需要返回值 
void show_head(list *head)
{
	list *p = NULL;//给空值,别自找麻烦
	printf("head");
	for(p=head->next;p != head;p=p->next)
	{
		printf("<--%d-->",p->num);
	}
	printf("head\n");
}

5.用尾插法插入新节点

//尾插
// 需要传入原链表,还有新节点,用指针传入的,插了就插了不需要返回 
void  insert_tail(list *head,list *node)
{
	//建个新指针方便用
	list *p = NULL;//初始化,别找麻烦
	//先找最后一个节点,别乱插
	for(p = head;p->next != head;p=p->next);//冒号不要掉了,找到了就是p
	p->next=node;
	node->next=head;//别忘了尾巴要指向头 
}

6.用头插法插入新节点

//头插
void  insert_head(list *head,list *node)
{
	list *p = NULL;
	p = head;
	node->next=p->next;
	p->next=node;
}

7.main函数

int main ()
{
	list *head = list_init();//调用创建头节点函数,有头节点有链表
	list *node = NULL;		 //用于创建新节点 
	int data;
	printf("请输入链表的每个元素,输入0停止输入:\n");
	while(1)				 //循环输入data,循环调用 node_init(int data)函数,循环调用 insert_tail(list *head,list *node)函数 
	{
		scanf("%d",&data);
		if(data == 0)
			break;
		node = node_init(data);
		insert_tail(head,node);//此处用的是尾插 
		//insert_head(head,node);
		show_head(head);
	}
	
	return 0;
}

8.完整代码(方便新手小白完成作业,建议用DEV C++编译运行)

#include <stdio.h>
#include <stdlib.h>

//没有装不下 
typedef struct list{
	int num;
	struct list *next;
}list;

//头节点的初始化(有头有链表)(调用此函数既有头) 
list *list_init(void)//创建不需要任何返回参数,需要返回已经创建好的头节点地址 
{
	list *head = (list *)malloc(sizeof(list));
	if(head == NULL)
	{
		printf("申请内存失败\n");
		return NULL; 
	}
	//头节点已经存在,但没数据 
	head->num=0;
	head->next=head;//循环列表的指针指向自己 
	//返回!返回! 
	return head; 
}

//创建新节点,既将数据放进一个结构体中
list *node_init(int data)//参数为要传入的数据 
{
	list *node = (list *)malloc(sizeof(list));
	if(node == NULL)
	{
		printf("申请内存失败\n");
		return NULL; 
	}
	//数据!数据!
	node->num = data;
	node->next=NULL;
	//返回!返回! 
	return node;
}

//展示函数,需要你的head(有头有链表),给你看看就行,不需要返回值 
void show_head(list *head)
{
	list *p = NULL;//给空值,别自找麻烦
	printf("head");
	for(p=head->next;p != head;p=p->next)
	{
		printf("<--%d-->",p->num);
	}
	printf("head\n");
}

//尾插
// 需要传入原链表,还有新节点,用指针传入的,插了就插了不需要返回 
void  insert_tail(list *head,list *node)
{
	//建个新指针方便用
	list *p = NULL;//初始化,别找麻烦
	//先找最后一个节点,别乱插
	for(p = head;p->next != head;p=p->next);//冒号不要掉了,找到了就是p
	p->next=node;
	node->next=head;//别忘了尾巴要指向头 
}

//头插
void  insert_head(list *head,list *node)
{
	list *p = NULL;
	p = head;
	node->next=p->next;
	p->next=node;
}




int main ()
{
	list *head = list_init();//调用创建头节点函数,有头节点有链表
	list *node = NULL;		 //用于创建新节点 
	int data;
	printf("请输入链表的每个元素,输入0停止输入:\n");
	while(1)				 //循环输入data,循环调用 node_init(int data)函数,循环调用 insert_tail(list *head,list *node)函数 
	{
		scanf("%d",&data);
		if(data == 0)
			break;
		node = node_init(data);
		insert_tail(head,node);//此处用的是尾插 
		//insert_head(head,node);
		show_head(head);
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值