单链表-自用

链表

1.创建链表

2.链表插入数据

3.删除链表数据

4.输出链表数据

5.删除链表

下面创建五个自定义函数分别进行五个上面的操作

typedef  struct  Grade_Info  NODE;
//1.创建链表 
NODE *Create_LinkList(void)
{
	NODE *head, *tail, *pnew;
	int score;
	head = (NODE *)malloc(sizeof(NODE));//创建头节点
	if(head == NULL)//创建失败,则返回
	{
		printf("no enough memory!\n");
		return (NULL);
	}  
	head->next = NULL; //头节点的指针域置NULL
	tail = head;       //开始时尾指针指向头节点
	printf("input the score of students:\n");
	while(1) //创建学生成绩线性链表
	{
		scanf("%d", &score); //输入成绩
		if (score < 0)        //成绩为负,循环退出
		    break;
		 //创建一新节点
		pnew = (NODE *)malloc(sizeof(NODE));  
		if(pnew == NULL) //创建新节点失败,则返回
		{
			printf("no enough memory!\n");
			return (NULL);
		}
		pnew->score = score;   
		pnew->next = NULL;  
		tail->next = pnew; 
        /*是让头结点指向后一个节点,也就是建立两个节点的关联关系
        然后面的tail=pnew;后,尾结点就变成了第二个
        再次调用该函数再执行这一句时第二个节点指向第三个节点,
        所以不是head->next=pnew;这样的话中间的节点没有记录上*/    
		tail = pnew; //让tail指针表示真正意义上的尾结点 
	}
	return (head);
}
//在指定位置插入节点 

注意:head 和 tail 都不存放数据

开始是三个结构体指针指向结构体head

head tail pnew

//2.在指定位置插入节点 
void Insert_LinkList(NODE *head, NODE *pnew, int i)  
{
	NODE *p;
	int j;
	p = head;
	for(j = 0; j < i && p != NULL; j++)//将p指向要插入的第i个节点
		p = p->next;
	if(p == NULL)//表明链表中第i个节点不存在
	{
		printf ("the %d node not foundt!\n", i);
		return;
	}
	pnew->next = p->next; //将插入节点的指针域指向第i个节点的后继节点
	p->next = pnew;        //将第i个节点的指针域指向插入节点
} 

注意:i表示第几个要删除

//删除指定位置的节点

//删除指定位置的节点
void Delete_LinkList(NODE *head, int i)  
{
	NODE *p,*q;
	int  j;
	if(i == 0)    
	return;   //删除的是头指针,则返回
	p = head;
	//将p指向要删除的第i个节点的前驱节点
	for(j=1; j<i && p->next != NULL; j++) 
		p = p->next;  
	if(p->next == NULL)   //表明链表中第i个节点不存在
	{
		printf("the %d node not foundt!\n", i);
		return;
	}
	q = p->next;   //q指向待删除的节点i
	p->next = q->next ; //删除节点i
	free(q);         //释放节点i的内存单元
} 

无注意事项

//输出链表 
void Display_LinkList(NODE *head)  
{
	NODE *p;
	for(p = head->next; p != NULL; p = p->next)// p->next表示下一个节点的地址 
		printf("%d ", p->score);
	printf ("\n");
}

无注意事项

//链表的销毁操作 
void Free_LinkList(NODE *head)  
{
	NODE *p, *q;
	p = head;
	while(p->next != NULL)
	{
		//将每一个节点从当前链表中脱离 
		q = p->next;
		p->next = q->next;
		free(q);//释放脱离链表节点的物理内存 
	}
	free(head);//退出循环后,意味着链表中只有头结点了,把它从内存中释放 
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小袁拒绝摆烂

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值