链表的插入和删除-学生成绩录入程序管理

数据结构-链表的插入和删除-单向链表

链表的插入删除-改进学生录入程序

改进单向链表学生成绩录入,增加添加删除函数,再输入结束后通过添加删除函数来更改链表,遍历输出。

单向链表实现

#include "stdafx.h"


struct Student
{
	int grade;
	struct Student *next;
};

typedef struct Student Node;
typedef Node* Ptr;

int main()
{
	Ptr head;
	int num;
	Ptr Creatlink();
	void Insert(Ptr head);
	void Delete(Ptr head);

	head = Creatlink();
	printf_s("选择操作:1.插入。2.删除\n");
	scanf_s("%d", &num);
	if (num == 1)
	{
		Insert(head);
	}
	else if (num=2)
	{
		Delete(head);
	}
    return 0;
}

Ptr Creatlink()
{
	Ptr head, previous, last;
	int num;

	head = (Ptr)malloc(sizeof(Node));
	if (head == NULL)
	{
		printf_s("wrong!");
		return NULL;
	}
	last = head;
	scanf_s("%d", &num);

	while (num != 0)
	{
		previous = last;
		previous->grade = num;
		last = (Ptr)malloc(sizeof(Node));
		if (last == NULL)
		{
			printf_s("wrong!");
			return NULL;
		}
		previous->next = last;
		scanf_s("%d", &num);
	}
	previous->next = NULL;
	free(last);
	return head;
}

void Insert(Ptr head)
{
	Ptr previous, last, temp;
	int num, num1, i;								//num是插入的成绩  num1是插入的位置
	last = head;
	printf_s("请输入要插入的成绩");
	scanf_s("%d", &num);
	printf_s("请输出要插入的位置");
	scanf_s("%d", &num1);

	//申请要插入的结点的空间 失败则退出
	temp = (Ptr)malloc(sizeof(Node));
	if (temp == NULL)
	{
		printf_s("wrong!");
		return ;
	}
	temp->grade = num;
	if(num==1)											//如果插入点在第一个结点之前		将head指针指向第一个结点  (新结点成为第一个结点)
	{
		temp->next = head;						//temp->next和head一样  现在指向原来的第一个结点
		head = temp;
	}
	else														//如果插入的不是第一个结点,找到位置正常插入即可。
	{
		for (i = num1; i > 1; i--)					//last其实指向head
		{
			previous = last;							//last指针后移到该添加的结点
			last = last->next;
		}
		previous->next = temp;				//上一个last结点next指针指向temp  temp的next指针指向最后的last结点  成功添加
		temp->next = last;
	}
	printf_s("插入成功 当前成绩为:");
	while (head != NULL)
	{
		printf_s("%d\n", head->grade);
		previous = head;
		head = head->next;
		free(previous);
	}
}

void Delete(Ptr head)
{
	Ptr previous, last;
	int num;
	last = head;
	previous = NULL;										//骚操作
	printf_s("请输入要删除的成绩:");
	scanf_s("%d", &num);		
	while (last->grade != num)						//骚操作。如果删除是头结点 则这个循环一次都不执行,下面if判断语句执行
	{
		previous = last;
		last = last->next;
	}
	if (previous!=NULL)									//previous不是空 那么就是不删除头结点的情况
	{
		previous->next = last->next;				//要删除的结点的前一个结点的next指针直接指向要删除结点的下一个结点  last没有链接再链表内了
		free(last);												//释放last结点
	}
	else                                                            //如果被删除的是第一个结点,将head指针指向第二个结点释放第一个结点
	{
		head = last->next;
		free(last);
	}
	printf_s("删除成功 当前成绩为:");
	while (head != NULL)
	{
		printf_s("%d\n", head->grade);
		previous = head;
		head = head->next;
		free(previous);
	}
}

示意图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值