C++ 数据结构 *** 普通链表

昨晚想看图的数据结构,于是打开了书。。恶补链表。。。
才意识到一个结点里指向下一个结点是指针,每次改变节点的指向时需要一个中间变量。。我真是太愚蠢了。。。上代码。。

代码如下:

<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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值