#include "stdafx.h"
#include <string>
#include <iostream>
#include <Windows.h>
using namespace std;
class LinkNode
{
public:
int nID;
string name;
LinkNode* pNext;
};
class LinkList
{
public:
int size;
LinkNode* head;
};
void initList(LinkList* list)
{
int nCount = 0;
cout << "请输入学生个数" << endl;
cin >> nCount;
//LinkList* list = new LinkList();
list->size = 0;
//头结点不保存数据
list->head = new LinkNode();
list->head->pNext = nullptr;
//新建一个指向尾部的指针,赋值(指向)头结点
LinkNode* tailPtrNode = list->head;
for (int i = 0; i < nCount; i++)
{
//new一个节点
LinkNode* studentNode = new LinkNode();
//将tail(head)的next指向要插入的节点,此时head的next也指向了要插入的这个节点,链接成功
tailPtrNode->pNext = studentNode;
//将这个新插入的节点的next置为nullptr
studentNode->pNext = nullptr;
cout << "请输入学生ID 姓名" << endl;
cin >> studentNode->nID >> studentNode->name;
//把这个新插入的节点赋值(指向)给tail
//实际上是 tailPtrNode = studentNode;
tailPtrNode = tailPtrNode->pNext;
//list长度加一
list->size++;
}
}
void showList(LinkList* list)
{
//遍历
LinkNode* curPtrNode = list->head;
while (curPtrNode->pNext != nullptr)
{
curPtrNode = curPtrNode->pNext;
cout << "学号:";
cout << curPtrNode->nID << "\t";
cout << "姓名:";
cout << curPtrNode->name << endl;
}
}
LinkNode* getNodeByID(LinkList* list, int nID)//通过位置获取
{
if (list->head->pNext == nullptr)
{
return nullptr;
}
if (nID>list->size || nID<0)
{
return nullptr;
}
if (nID == 0)
{
return list->head;
}
int nCount = 0;
LinkNode* curPtrNode = list->head;
while (curPtrNode->pNext != nullptr)
{
curPtrNode = curPtrNode->pNext;
nCount++;
if (nID == nCount)
{
return curPtrNode;
}
}
}
void insertNode(LinkList* list, int nPost)//通过位置插入
{
if (list->head->pNext == nullptr)
{
return;
}
if (nPost > list->size || nPost <= 0)
{
return;
}
LinkNode* curPtrNode = getNodeByID(list, nPost - 1);
LinkNode* insertNode = new LinkNode();
cin >> insertNode->nID >> insertNode->name;
insertNode->pNext = curPtrNode->pNext;
curPtrNode->pNext = insertNode;
}
void addNode(LinkList* list)//尾部添加一个学生
{
if (list->head->pNext == nullptr)
{
return;
}
cout << "请输入要添加学生的ID,姓名" << endl;
LinkNode* studentNode = new LinkNode();
cin >> studentNode->nID >> studentNode->name;
LinkNode* curPtrNode = list->head;
while (curPtrNode->pNext != nullptr)
{
curPtrNode = curPtrNode->pNext;
}
curPtrNode->pNext = studentNode;
studentNode->pNext = nullptr;
}
void deleteNode(LinkList* list, int nPost)//通过位置删除
{
if (list->head->pNext == nullptr)
{
return;
}
if (nPost > list->size || nPost <= 0)
{
return;
}
LinkNode* curPtrNode = getNodeByID(list, nPost - 1);
LinkNode* deleteNode = curPtrNode->pNext;
curPtrNode->pNext = curPtrNode->pNext->pNext;
if (deleteNode)
{
delete(deleteNode);
}
//delete(deleteNode);
}
void reverse(LinkList* list)
{
if (list->head->pNext == nullptr)
{
return;
}
LinkNode* p=list->head;
LinkNode* q = nullptr;
LinkNode* r = nullptr;
p = p->pNext;
if (p->pNext == nullptr)
{
return;
}
q = p->pNext;
if (q->pNext == nullptr)
{
p->pNext = nullptr;
q->pNext = p;
list->head->pNext = q;
return;
}
r = q->pNext;
if (r->pNext == nullptr)
{
p->pNext = nullptr;
q->pNext = p;
r->pNext = q;
list->head->pNext = r;
return;
}
else if (r->pNext != nullptr)
{
p->pNext = nullptr;
q->pNext = p;
p = q;
q = r;
r = r->pNext;
while (r->pNext != nullptr)
{
// p = p->pNext;
// q = p->pNext;
// r = q->pNext;
q->pNext = p;
p = q;
q = r;
r = r->pNext;
}
q->pNext = p;
r->pNext = q;
list->head->pNext = r;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int nPost = 0;
LinkList* list = new LinkList();
initList(list);
showList(list);
//addNode(list);//尾部添加一个学生
//showList(list);
//cout << "输入要插入的学生位置,id,姓名(要插入的位置不能大于学生个数)" << endl;
//cin >> nPost;
//insertNode(list, nPost);
//showList(list);
//cout << "输入要删除的学生位置(要删除的位置不能大于学生个数)" << endl;
//cin >> nPost;
//deleteNode(list, nPost);
cout << "反转后" << endl;
reverse(list);
showList(list);
system("pause");
return 0;
}