⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mylist.cpp

📁 C++课程更学习...对于初学者很有好出
💻 CPP
字号:
#include "stdafx.h"
#include <stdio.h>
#include "mylist.h"

student* CreateNode()
{
	student* pTemp = new student;
	pTemp->pNext = NULL;
	printf("请输入姓名,学号,分数:");
	scanf("%s%d%d", pTemp->szName,
		&pTemp->nNumber,
		&pTemp->nScore);
	return pTemp;
}

void AddToTail(student* &pHead, 
			   student* &pTail,
			   student* pTemp)
{
	if(pHead == NULL)
	{
		pHead = pTemp;
		pTail = pTemp;
	}
	else 
	{
		pTail->pNext = pTemp;
		pTail = pTemp;
	}
}

// 插入新节点到链表中的适当位置
// 此函数我们按学号顺序插入
void InsertNode(student* &pHead, 
			   student* &pTail,
			   student* pTemp)
{
	// 0.空链表
	if (pTail == NULL && pHead == NULL)
	{
		pHead = pTemp;
		pTail = pTemp;
		return ;
	}
	// 1.比头节点还小
	else if (pTemp->nNumber <= pHead->nNumber)
	{
		pTemp->pNext = pHead;
		pHead = pTemp;
		return ;
	}
	// 2.比尾节点还大
	else if (pTemp->nNumber >= pTail->nNumber)
	{
		pTail->pNext = pTemp;
		pTail = pTemp;
		return ;
	}
	
	// 3. 普通情况
	student* pCurrent = pHead;
	while (pCurrent != NULL)
	{
		if (pCurrent->nNumber <= pTemp->nNumber &&
			pCurrent->pNext->nNumber >= pTemp->nNumber)
		{
			// 让新节点指向后一个节点
			pTemp->pNext = pCurrent->pNext;
			// 让当前节点指向新节点自己
			pCurrent->pNext = pTemp;
			break;
		}
		pCurrent = pCurrent->pNext;
	}
}

// 删除由nNumber指定学号的节点
void DeleteNode(student* &pHead,
				student* &pTail,
				int nNumber)
{
	// 0.空链表
	if (pHead == NULL && pTail == NULL)
	{
		return ;
	}
	// 1.删除链表的头节点
	else if (pHead->nNumber == nNumber)
	{
		if (pHead == pTail) // 只有一个节点
		{
			delete pHead;
			pHead = NULL;
			pTail = NULL;
		}
		else // 有大于一个的节点
		{
			student* pBackup = pHead->pNext;
			delete pHead;
			pHead = pBackup;
		}
		return ;
	}

	// 2.普通情况
	student* pTemp = pHead;
	student* pPrev = pHead;
	while (pTemp != NULL)
	{
		if (pTemp->nNumber == nNumber)
		{
			// 找到了节点,删除它!
			if (pTemp == pTail) // 尾节点
			{
				pPrev->pNext = pTemp->pNext;
				delete pTemp;
				pTail = pPrev;
			}
			else // 非尾节点
			{
				pPrev->pNext = pTemp->pNext;
				delete pTemp;
			}
			break;
		}
		pPrev = pTemp;
		pTemp = pTemp->pNext;
	}
}

void PrintList(student* pHead)
{
	student* pTemp = pHead;
	while (pTemp != NULL)
	{
		printf("姓名,学号,分数:%s,%d,%d\n",
			pTemp->szName, 
			pTemp->nNumber,
			pTemp->nScore);
		pTemp = pTemp->pNext;
	}
}

// 释放整个链表
void FreeList(student* &pHead, student* &pTail)
{
	student* pTemp = pHead;
	while (pTemp != NULL)
	{
		student* pBackup = pTemp->pNext;
		delete pTemp;
		pTemp = pBackup;
	}
	pHead = NULL;
	pTail = NULL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -