用一个链表存储这种模块头+条目的数据,
冒泡排序需要点想法
LinkList.h
#pragma once
#include
struct Node
{
BYTE bLength;
BYTE bCopySize;
WORD wId;
WORD wSecSize;
DWORD dwInfo;
DWORD dwAddress0;
DWORD dwAddress1;
Node* next;
};
class LinkList
{
public:
LinkList();
~LinkList();
Node* head;
CFile readFile;
CFile writeFile;
char headSection[50];
unsigned short quantity;
void ShowListHead();
void ShowListBody();
void Insert(Node* newNode, int location);
int Find(int NodeID);
void Delete(int NodeID);
void Set(int NodeID, int i, char address[4]);
void Sort();
void Swap(Node* temp0, Node*temp1);
void Save();
};
int main()
{
LinkList list;
list.ShowListHead();
Node* newNode = new Node;
newNode->next = NULL;
list.Insert(newNode, 1);
list.Delete(1);
//char a[4] = { '0','0','0','0' };
//list.Set(2, 0, a);
list.Sort();
list.ShowListBody();
list.Save();
return 0;
}
LinkList.cpp
#include "LinkList.h" #include#include LinkList::LinkList() { readFile.Open(_T("E:\desktop\01.rpm"), CFile::modeRead); readFile.Read(headSection, 50); quantity = short(headSection[48]) + short(headSection[49]) * pow(16, 2); head = new Node; head->next = NULL; Node* temp = head; for (int i = 0;i < quantity;i++) { char buffer[18]; readFile.Read(buffer, 18); Node* newNode = new Node; newNode->bLength = *(BYTE*)(buffer); newNode->bCopySize = *(BYTE*)(buffer + 1); newNode->wId = *(WORD*)(buffer + 2); newNode->wSecSize = *(WORD*)(buffer + 4); newNode->dwInfo = *(DWORD*)(buffer + 6); newNode->dwAddress0 = *(DWORD*)(buffer + 10); newNode->dwAddress1 = *(DWORD*)(buffer + 14); newNode->next = NULL; temp->next = newNode; temp = temp->next; } readFile.Close(); } LinkList::~LinkList() { Node* temp = head; for (int i = 0; i < quantity;i++) { Node* newNode = temp->next; delete temp; temp = newNode; } delete temp; } void LinkList::ShowListHead() { std::cout << "头部标识为:"; for (int i = 0;i < 4;i++) { std::cout << headSection[i]; } std::cout << std::endl << "校验值为:"; for (int i = 12;i < 16;i++) { std::cout << headSection[i]; } std::cout << std::endl << "版本信息为:"; for (int i = 16;i < 24;i++) { std::cout << headSection[i]; } std::cout << std::endl << "列表结构起始位置为:"; for (int i = 6;i < 8;i++) { std::cout << headSection[i]; } std::cout << std::endl << std::endl; } void LinkList::ShowListBody() { Node* temp = head->next; int i = 1; while (temp->next != NULL) { std::cout << "条目长度为:" << temp->bLength << std::endl; std::cout << "备份个数为:" << temp->bCopySize << std::endl; std::cout << "模块ID为:" << temp->wId << std::endl; std::cout << "模块扇区大小为:" << temp->wSecSize << std::endl; std::cout << "版本信息为:" << temp->dwInfo << std::endl; std::cout << "备份0地址为:" << temp->dwAddress0 << std::endl; std::cout << "备份1地址为:" << temp->dwAddress1 << std::endl; std::cout << "条目次序为:" << i++ << std::endl << std::endl; temp = temp->next; } } void LinkList::Insert(Node* newNode, int location) { Node* temp = head; for (int i = 1;i < location;i++) { temp = temp->next; } newNode->next = temp->next; temp->next = newNode; quantity++; } int LinkList::Find(int NodeID) { Node* temp = head; int turnNum = 1; while (temp->next != NULL) { temp = temp->next; if (temp->wId == NodeID) { return turnNum; } turnNum++; } return -1; } void LinkList::Delete(int NodeID) { int n = Find(NodeID); if (n == -1) { std::cout << "没有找到该ID对应的条目" << std::endl; return; } Node* temp = head; for (int i = 0;i < n - 1;i++) { temp = temp->next; } Node* node = temp->next; if (n < quantity) { temp->next = temp->next->next; } else { temp->next = NULL; } delete node; quantity--; } void LinkList::Set(int NodeID, int i, char address[4]) { Node* temp = head; while (temp->next != NULL) { temp = temp->next; if (temp->wId == NodeID) { if (i == 0) { DWORD add = *(DWORD*)(address); temp->dwAddress0 = add; } else if (i == 1) { DWORD add = *(DWORD*)(address); temp->dwAddress1 = add; } return; } } std::cout << "没有找到该ID对应的条目" << std::endl; } void LinkList::Sort() { Node* temp0; Node* temp1; Node* end = NULL; while (head->next != end) { temp0 = head; temp1 = temp0->next; while (temp1->next != end) { if (temp1->wId > temp1->next->wId) { temp0->next = temp1->next; temp1->next = temp0->next->next; temp0->next->next = temp1; temp1 = temp0->next; } temp0 = temp0->next; temp1 = temp1->next; } end = temp1; } } void LinkList::Save() { writeFile.Open(_T("E:\desktop\abc\01.rpm"), CFile::modeWrite | CFile::modeCreate); writeFile.Write(headSection, 50); Node* node = head->next; while (node->next != NULL) { writeFile.Write(node, 18); node = node->next; } }



