02.线性链表

线性链表

#include<stdio.h>

//C语言P345 线性链表

struct Grade
//可以理解为score是存储数据,next是指针,一个链表是由  数据+指针  组成
{
	int score;
	struct Grade *next;//指向自身的指针
};
typedef struct Grade NODE;//记住typedef的用法

//线性表的创建

NODE *Create_LinkList() {
	NODE *head;//头结点
	NODE *tail;//尾结点
	NODE *pnew;//指向实际数据的节点
	int score;//数据
	head = (NODE *)malloc(sizeof(NODE));//创建头结点
	if (head==NULL)
	{
		printf("头结点创建失败!");
		return NULL;
	}

	head->next = NULL;//头结点的指针域设置为NULL
	tail = head;//开始时尾结点指向头结点0
	printf("输入学生的成绩:");
	while (1)
	{
		scanf("%d", &score);
		if(score<0) //当输入成绩为负,跳出循环,停止输入
			break;
		pnew = (NODE *)malloc(sizeof(NODE));//创建新的节点
		if (pnew==NULL)
		{
			printf("没有足够的空间!\n");
			return NULL;
		}
		pnew->score = score;//新节点数据域存放数据
		pnew->next = NULL;//新节点的指针域设置为NULL
		tail->next = pnew;//新节点插入到链尾
		tail = pnew;//指向当前的尾结点
	}
	return head;//返回创建的链表的头结点
}

//插入操作

void Insert_LinkList(NODE *head, NODE *pnew, int i) {
	NODE *p;
	int j;
	p = head;
	for (j = 0;j < i&&p != NULL;j++)
		p = p->next;
	if (p==NULL)
	{
		printf("第%d个节点不存在!\n", i);
		return;
	}
	//关键操作
	pnew->next = p->next;
	p->next = pnew;
}


//删除操作

void Delete_LinkList(NODE *head, int i) {
	NODE *p, *q;
	int j;
	if (i == 0)
		return;
	p = head;
	for (j = 1;j < i&&p->next != NULL;j++)
		p = p->next;
	if (p->next==NULL)
	{
		printf("第%d个和节点不存在!\n", i);
		return;
	}
	q = p->next;//q指向待删除的节点i
	p->next = q->next;//其实上面两句相当于p->next = p->next->next
	free(q);//释放第i个节点的数据
}

//链表的输出操作

void Display_LinkList(NODE *head) {
	NODE *p;
	for (p = head->next;p!=NULL;p = p->next)
		printf("%d\t", 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);
}

void main() {
	NODE *head, *pnew;
	head = Create_LinkList();//创建链表,输入数据
	if (head == NULL)//创建失败
		return;
	printf("输出创建节点:");
	Display_LinkList(head);//链表的输出操作
	pnew = (NODE *)malloc(sizeof(NODE));//新建一个节点
	if (pnew==NULL)
	{
		printf("节点创建失败!");
		return;
	}
	pnew->score = 88;
	Insert_LinkList(head, pnew, 3);//将新节点插入节点3后面
	printf("插入新的节点:");
	Display_LinkList(head);//输出操作
	
	Delete_LinkList(head, 3);//删除节点3
	printf("删除节点后:");
	Display_LinkList(head);//输出操作
	Free_LinkList(head);//销毁链表

}

输出数据可以为非零正数,在最后输入-1表示结束

例如120 130 140 150 160 -1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值