02.线性链表

02.线性链表,第1张

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5503589.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存