栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

02.线性链表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

02.线性链表

线性链表

#include

//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("%dt", 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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/512530.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号