昨晚想看图的数据结构,于是打开了书。。恶补链表。。。
才意识到一个结点里指向下一个结点是指针,每次改变节点的指向时需要一个中间变量。。我真是太愚蠢了。。。上代码。。
代码如下:
<div>#pragma warning(disable:4996)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<stack>
#include<cstring>
#include<sstream>
#include<set>
#include<string>
#include<iterator>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;</div><div>
</div><div>//链表
class Chain;</div><div>
</div><div>//结点
</div><div>class ChainNode {
friend class Chain;
public:
ChainNode(int element=0, ChainNode * next=NULL) {
data = element;
link = next;
}
private:
int data;
ChainNode *link;
};</div><div>
</div><div>class Chain {
public:
Chain() { first = new ChainNode; }//constructor
~Chain() { delete first; }//destructor
int Length();//返回链表结点数
ChainNode* GetFirst();//返回链表首位置
void Delete(ChainNode *x);//删除链表中某个任意结点的指针
void DeleteODD();//删除链表中奇数序号结点
void Insert(ChainNode *x);//在尾端插入结点
void Merge(Chain &x, Chain &y);//合并链表,合并之后将x、y设置成空链表
void DesOrder(Chain &x, Chain &y);//按非降序合并链表,合并后将x、y设置成空链表
private:
ChainNode *first;
};</div><div>//返回链表结点数
</div><div>int Chain::Length() {
ChainNode* temp;
int l = 0;
for (temp = first; temp->link; temp = temp->link)
++l;
return l;
}</div><div>//返回链表首位置
ChainNode* Chain::GetFirst() {
return this->first;
}</div><div>//删除链表中某个任意结点的指针
void Chain::Delete(ChainNode *x) {
if (x == first) {
delete first;
first->link = NULL;
first = new ChainNode;
}
else {
ChainNode *pre;
for (pre = first; pre->link != x; pre = pre->link);
pre->link = x->link;
}
}</div><div>//在尾端插入结点
void Chain::Insert(ChainNode *x) {
ChainNode *pre;
for (pre = first; pre->link; pre = pre->link);
pre->link = x;
x->link = NULL;
}</div><div>//删除链表中奇数需要结点
void Chain::DeleteODD() {
ChainNode *pre;
for (pre = first; pre->link; pre = pre->link)
pre->link = (pre->link)->link;
}</div><div>//合并链表,合并之后将x、y设置成空链表
void Chain::Merge(Chain &x, Chain &y) {
ChainNode *prex, *prey;
ChainNode *xx, *yy;
for (prex = x.first->link, prey = y.first->link; prex&&prey;
prex = xx, prey = yy) {
xx = prex->link;//每次都要将结点prex的下一个结点记录,否则会丢失该结点
this->Insert(prex);
yy = prey->link;
this->Insert(prey);
}
while (prey) { this->Insert(prey); prey = prey->link; }
while (prex) { this->Insert(prex); prex = prex->link; }
x.first->link = y.first->link = NULL;
}</div><div>//按非降序合并链表,合并之后将x、y设置成空链表
void Chain::DesOrder(Chain &x, Chain &y) {
ChainNode *prex = x.first->link, *prey = y.first->link;
ChainNode *xx, *yy;
while (prex&&prey) {
if (prex->data <= prey->data) {
xx = prex->link;
this->Insert(prex);
prex = xx;
}
else {
yy = prey->link;
this->Insert(prey);
prey = yy;
}
}
while (prey) { this->Insert(prey); prey = prey->link; }
while (prex) { this->Insert(prex); prex = prex->link; }
x.first->link = y.first->link = NULL;
}
int main(void) {
Chain m,n,z;
ChainNode *ele = new ChainNode(20, NULL);
ChainNode *e1 = new ChainNode(30, NULL);
ChainNode *e2 = new ChainNode(40, NULL);
ChainNode *e3 = new ChainNode(50, NULL);
ChainNode *e4 = new ChainNode(60, NULL);
ChainNode *e5 = new ChainNode(70, NULL);
m.Insert(ele);
m.Insert(e1);
m.Insert(e3);
m.Insert(e5);
n.Insert(e2);
n.Insert(e4);
z.DesOrder(m, n);
cout << m.Length() << endl;
cout << n.Length() << endl;
cout << z.Length() << endl;
return 0;
}</div>