1、数据结构 矩阵操作运行时的显示界面,可选择相应操作#include/多用链表结点templatestruct DblNode ET data; /结点数据域,存储该结点的数据部分 DblNode* next; /结点指针域,指示下一个节点的位置 DblNode* back; /指向结点的前驱 DblNode() next = NULL; back = NULL; /无参数结点构造函数,用于未给定参数时结点的初始化;/=/ 链表类 部分/=templateclass LinkList protected: ET dataTmp; /用于临时存取数据,供成员函数使用 int count, cTmp
2、; /count用于计数表元素个数,即表长; cTmp用于临时计数用 DblNode *head, *tail, *pTmp; /*head记录表头的位置; *tail记录表尾的位置; *pTmp记录每次操作结点的指针位置 public: LinkList() count=cTmp=0; head = tail = pTmp = NULL; /链表构造函数 LinkList() Clear(); /链表析构函数/链表相关操作 int Length() return count; /用于获取当前标的长度 void Clear() while(count) DelHead(); /表清空 void
3、 Show(); /输出表中现有的所有元素 void ReShow(); /逆序输出表中现有的所有元素 DblNode* GetPosP(int postion); /获取指向第postion个位置结点的指针 void HeadInsert(ET &e); /从表头插入元素 void TailInsert(ET &e); /从表尾插入元素 void Insert(int position, ET &e); /向表中第postion个位置插入新的结点元素,元素总数加一 void ReTailInsert(int position, ET &e); /重置表中第cTmp个位置元素的数据部分为e,元
4、素总数不变 void GetElem(int position, ET &e); /从表中获取第cTmp元素,写入e中,由e输出 void DelHead(); /删除表头 void DelTail(); /删除表尾 void DelElem(int position); /删除表中第cTmp个位置的元素.元素减一 void operator = (LinkList& cop); /赋值符重载函数,实现链表的复制功能 void SUB(LinkList &A, LinkList &B); /实现链表相减,将仅存在于A中的元素写入当前链表 void ADD(LinkList &A, LinkLi
5、st &B); /实现链表相加,将表A 表B中的元素依次写入当前链表 void Seprate(); /奇偶分离函数,使得所有奇数均排列在偶数前 void Sort(); /对链表中的元素进行排序 void KillDouble(); /对链表中的元素进行排序去重 void CinHelp(); /提示输入函数,用于实现键盘输入交互式操作;templatevoid LinkList:Show() cTmp = count; pTmp = head; /指向头指针的第一个后继 coutendl当前链表中共有count个元素,endl0 & count0) /当表中有元素时 dataTmp = p
6、Tmp-data; coutdataTmpnext; /每输出一位向后移动一位 coutendl;templatevoid LinkList:ReShow() cTmp = count; pTmp = tail; /指向头指针的第一个后继 coutendl当前链表中共有count个元素,endl0 & count0) /当表中有元素时 dataTmp = pTmp-data; coutdataTmpback; /每输出一位向后移动一位 coutendl;templateDblNode* LinkList:GetPosP(int postion) cTmp = postion; if(cTmp1
7、) coutendl操作无效! 请确保输入元素位置大于0count) cTmp = cTmp % count; if(cTmp = 0) cTmp = count; /当输入位置大于元素总数时取余数得对应位置 if(cTmp 1) pTmp = pTmp-next; cTmp-; else /后count/2用back指针访问 cTmp = count - cTmp + 1; pTmp = tail; /不断指向下一个结点,头指针所在位置为零 while(cTmp1) pTmp = pTmp-back; cTmp-; return pTmp;templatevoid LinkList:ReTa
8、ilInsert(int position, ET &e) cTmp = position; if(count = 0)coutendl表当前为空,无元素可修改data = e; /重置表中元素,元素总数不变templatevoid LinkList:HeadInsert(ET &e) if(count = 0) /向表中插入第一个结点元素 head = new DblNode; tail = pTmp = head; head-data = e; count+; else head-back = new DblNode; head-back-next = head; head = head-
9、back; head-data = e; count+; templatevoid LinkList:TailInsert(ET &e) if(count = 0) /向表中插入第一个结点元素 tail = new DblNode; head = pTmp = tail; tail-data = e; count+; else tail-next = new DblNode; pTmp = tail-next; pTmp-back = tail; tail = pTmp; tail-data = e; count+; templatevoid LinkList:Insert(int posit
10、ion, ET &e)/在第pos个位置插入一个新结点 int pos = position; /因为此成员函数调用了获取指针位置函数GetPosP(),而该函数使用了cTmp计数区间,故需使用其他空间计数 if(pos1) coutendl操作无效! 请确保输入元素位置大于0count) /当输入位置大于元素总数时 if(pos % count = 1) pos = count+1; /输入位置大于元素总数且取余后为1,将pos置为插入尾部 else if(pos % count = 0) pos = count; else pos = pos % count; if(pos = 1) He
11、adInsert(e); else if(pos = count+1) TailInsert(e); else pTmp = GetPosP(pos-1); /获取指向第pos-1个结点的指针 DblNode* posNext = pTmp-next; /获取指向第pos个结点的指针 pTmp-next = new DblNode; /在pos-1后生成新结点 pTmp-next-back = pTmp; /新结点前驱为第pos-1个结点 pTmp-next-next = posNext; /新结点后继为原pos个结点 pTmp-next-data = e; posNext-back = pT
12、mp-next; /原pos个位置的结点前驱指向新结点 count+; templatevoid LinkList:GetElem(int position, ET &e) cTmp = position; if(cTmp1) coutendl操作无效! 请确保输入元素位置大于0data; /获取指向第cTmp个结点的数据部分templatevoid LinkList:DelHead() if(count = 0)coutendl操作无效!当前表已为空next; delete head; head = pTmp; count-; templatevoid LinkList:DelTail()
13、if(count = 0)coutendl操作无效!当前表已为空back; delete tail; tail = pTmp; count-; templatevoid LinkList:DelElem(int positon) /删除在第cTmp个位置的结点 cTmp = positon; if(cTmpcount) cTmp = cTmp % count; if(count = 0)coutendl表当前为空,无元素可修改endl; else if(count = 1 | cTmp = 1)DelHead(); else if(cTmp = count) DelTail(); else p
14、Tmp = GetPosP(cTmp-1); /获取指向第cTmp-1个结点的指针 DblNode* pNext = pTmp-next; /获取指向第cTmp个结点的指针 pTmp-next = pNext-next; /将第cTmp-1个结点的后继指向第cTmp个结点的后继 pNext-next-back = pTmp; /将第cTmp+1个结点的前驱指向第cTmp-1个结点 delete pNext; /将第cTmp个结点删除 count-; /表元素元素总数减一 templatevoid LinkList:operator = (LinkList& cop) /赋值符“ = ”重载 C
15、lear(); /对当前链表先清空 if(cop.count0) cTmp = cop.count; cop.pTmp = cop.head; /复制cop的头指针 注意:cop.pTmp 不可换做 pTmp ?否则运行报错 while(cTmp0) /当表中还有元素时 dataTmp = cop.pTmp-data; /取出后继结点中的数据 TailInsert(dataTmp); /生成新结点 cTmp -; /计数元素总数减一 cop.pTmp = cop.pTmp-next; /向后继结点移动一位 templatevoid LinkList:SUB(LinkList &A, LinkL
16、ist &B) Clear(); /对当前链表先清空 int countA=1, countB; ET elemA, elemB; DblNode* posA = A.head, * posB; while(countAdata; /依次获取A表中元素的数据部分 posA = posA-next; countA+; while(countBdata; posB = posB-next; if(elemA=elemB) break; /将A中的每一个元素分别与B中的每一个元素进行比较,若相同则中断本次循环 countB+; if(countBB.count) TailInsert(elemA);
17、 /若与B中所有元素均不相同时将该元素写入当前表中 templatevoid LinkList:ADD(LinkList &A, LinkList &B) Clear(); /对当前链表先清空 int countA=1, countB=1; DblNode* posA = A.head, * posB= B.head; while(countAdata); /依次获取A表中元素的数据部分,写入当前链表 posA = posA-next; countA+; while(countBdata); /依次获取B表中元素的数据部分 posB = posB-next; countB+; template
18、void LinkList:Seprate() /奇偶分离函数,使得所有奇数均排列在偶数前 int i=0, jb=0, jc=0; int *B = new intcount, *C = new intcount; /将链表中的元素按奇数、偶数分别存放到数组B、C中 DblNode* pos = head; ET tmp; while(i data; pos = pos-next; if(tmp%2 = 1) Bjb = tmp; jb+; /jb用于计数奇数的个数 else Cjc = tmp; jc+; /jc用于计数偶数的个数 i+; i = 0; pos = head; while(
19、i data = Bi; pos = pos-next; i+; i = 0; while(i data = Ci; pos = pos-next; i+; templatevoid LinkList:Sort() /对链表中的元素进行排序 int i=1, j; DblNode* posi = head, * posj; /初始时让posi指向第一个元素 ET tmp; while(i next; /初始时让posj指向第二个元素 while(j data posj-data) /若前面的元素大于后面的元素,则交换两元素的数据部分 tmp=posi-data; posi-data=posj-
20、data; posj-data=tmp; posj = posj-next; j+; posi = posi-next; i+; templatevoid LinkList:KillDouble() Sort(); /对链表中的元素进行排序 int i=1; DblNode* pos = head; /初始时让pos指向第一个元素 while(i data = pos-next-data) DelElem(i); /若第i个位置的元素和i+1个位置的元素数据部分相同时删除第i个元素 else i+; pos=pos-next; /否则指针指向下一个元素 templatevoid LinkLis
21、t:CinHelp() int choice=1, tmp; while(choice) coutendl请选择链表相关操作:endlendl1.添加新的元素 2.插入数据元素 3.删除表元素 4.修改元素 5.逆序输出表元素 endlendl6.链表清空 7.数据链表奇前偶后分离 8.数据链表元素排序 9.数据链表元素排序去重endlendlchoice; switch(choice) case 1: coutendltmp; choice = count; /链表中原有的元素数不应在计数范围内 coutendl请依次输入tmp个数据元素 空格间隔 Enter确认: endl; while(countdataTmp; TailInsert(dataTmp); Show(); break; case
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1