初试C++单向链表
来源:互联网 发布:iphone7p淘宝店铺 编辑:程序博客网 时间:2024/06/15 18:14
#include <stdio.h>#include <string.h>#include <iostream>using namespace std;class Node //声明节点{ int data; //储存数据 Node *next; //连接public: Node():next(NULL){ //构造 } Node(const int i):data(i),next(NULL){ } ~Node(){ } friend class Linked_list;};class Linked_list{ Node *head; //链表首地址 Node *tail;public: Linked_list():head(NULL),tail(NULL){ } Linked_list(const int *a,const unsigned int length):head(NULL),tail(NULL){ //用数组来构造 head = new Node(*a); // Node *p = new Node(*a); Node *p =head; // head = p; a++; for (int i = 1; i < length; ++i) //sizeof() 判定数组空间 { p->next= new Node( *a); //开空间,构造函数赋初值 a++; //数组指针移位 p = p->next; //链表指针移动 } tail = p; //记录末地址 } Linked_list(const Linked_list &other):head(NULL),tail(NULL){ //拷贝构造 head = new Node (other.head->data); // Node *p = new Node(other.head->data); Node *p= head; // head = p; Node *t =other.head; //定义链表指针,从而在函数运行的时候不改变other.head 的值 t =t->next; while(t !=NULL){ //判定是否拷贝 p->next= new Node( t->data); t = t->next; p = p->next; } tail =p; //记录末地址 } ~Linked_list(){ //析构函数 while(head !=NULL){ //判定 Node *tem = head; //定义链表指针,代替head释放空间 head = head->next; delete [] tem; } } Linked_list& Print(){ //输出成员函数 Node *tem = head; //定义链表指针,代替head移动 while(tem != NULL){ //判定 cout << tem->data<<","; tem = tem->next; //指针移位 } cout<<endl; return *this; } Linked_list& Head_add(const int x){ Node* tem = new Node (x); tem->next = head; head = tem ; // Node* tem =head; //两种写法 // head =new Node (x); // head->next = tem; return *this; } Linked_list& Pushback(const int x){ //添加一个数 tail->next = new Node(x); tail =tail->next; return *this; } Linked_list& Insert(const unsigned int j,const int x){ //插入一个数,j 决定第几个 if(j >0 ){ Node *tem =head; for (int i = 1; i < j; ++i) { tem = tem->next; if(tem ->next==NULL) break; } Node * p = tem->next; tem->next = new Node (x); tem = tem ->next; tem ->next= p; } else if(j==0){ this ->Head_add(x); } } Linked_list& Revise(const unsigned int j,const unsigned int x){ //修改数据 Node *tem = head; for (int i = 0; i < j-1; ++i) { tem = tem ->next; } tem ->data = x; } Linked_list& Delete(const unsigned int j){ //删除数据 if(j == 1){ Node * tem = head; head = head->next; delete [] tem; } else{ Node *tem =head; for (int i = 1; i < j-1;++i) { tem = tem ->next; } Node *p =tem; tem ->next = tem ->next->next; delete [] p->next; } return *this; } Linked_list& Insert(const unsigned int j,const int* a){ //插入数组,算法比较low if(j==0){ this ->Head_add(*a); } else if(j > 0){ Node *tem =head; for (int i = 1; i < j; ++i) { tem = tem->next; if(tem ->next==NULL) break; } Node *p = tem ; Node *x =tem ->next; for(int i= 0;i<sizeof(a);++i){ p->next = new Node (*a); p = p->next; a++; } p->next = x; } return *this; } Linked_list& Head_add(const int *a){ Node *tem =head; head = new Node (*a); Node *p =head; a++; for(int i= 1;i<sizeof(a);++i){ p->next = new Node (*a); p = p->next; a++; } p ->next= tem; return *this; } Linked_list& Delete(const unsigned int j,const unsigned int x){ //删除多个连续数据 Node * tem = head; if(j == 1){ for (int i = 0; i < x; ++i) { head = head->next; delete [] tem; tem = head; } } else{ for (int i = 1; i < j-1;++i) { tem = tem ->next; } Node *p =tem; for (int i = 0; i < x; ++i) { tem ->next = tem ->next->next; delete [] p->next; p = tem ; } } return *this; } Linked_list& Pushback(const int *a){ //添加数组 Node *p = tail; for(int i= 0;i<sizeof(a);++i){ p->next = new Node (*a); p = p->next; a++; } tail =p; return *this; } //排序 BOSS Linked_list& Asend(){ // for (Node *x= head; x->next != NULL; x=x->next) //只交换值,而没能以Node伟整体排序, // { //简单地说就是,交换指针和交换值两种层次 // for(Node *y=head;y->next !=NULL;y = y->next){ // if(y->data>y->next ->data){ // int tdata= y->data; // y->data = y->next ->data; // y->next ->data = tdata; // } // } // } Node *tem= new Node[1]; tem->next =head; //算法较low,望大佬指点 for(Node *x= tem;x ->next!=NULL; x=x->next){ for(Node *y =tem;y->next->next !=NULL;y=y->next){ if(y->next->data > y->next->next->data){ Node *a = y ; Node *c = y->next; Node *b = y->next->next; Node *d = y->next->next->next; a->next=b; b->next =c; c->next =d; x = a; } } } head = tem ->next; delete [] tem; return *this; }}; ostream &operator <<(ostream &out,Linked_list& other){ other.Print(); return cout; } int main(){ int a[4] = {4,3,2,1}; int b [10]= {5,4,3,2,1,10,9,8,7,6}; Linked_list list1(a,4); Linked_list list2(b,10); list2.Pushback(9); list2.Insert(4,b); list2.Head_add(a); list2.Delete(2,2); list2.Pushback(a); list2.Revise(9,8); list2.Print(); list2.Asend(); //cout << list1; list2.Print(); return 0;}
0 0
- 初试C++单向链表
- List-c单向链表
- list-c单向链表
- C语言版单向链表
- C语言单向链表
- C 单向链表反转
- C语言 单向链表
- C++:单向链表实现
- C语言单向链表
- c语言-单向链表
- C 通用单向链表
- C语言单向链表的实现
- 求助 C语言的单向链表
- 单向循环链表C/C++版
- C语言实现的单向链表
- 单向链表C语言实现
- C语言 单向链表倒序
- 单向链表的C语言实现
- JS基础知识
- HZAU 1199 Little Red Riding Hood (dp)
- opencv从零开始——2. ROI与线性融合
- dubbo 配置文件详解
- 软件设计发展路线
- 初试C++单向链表
- static
- 二叉树的做题总结
- Xutils3.0网络带缓存的封装
- 【leetcode】链表的基本操作
- 从Redis+Lua到Goroutine,日均10亿次的股票行情计算实践
- 563. Binary Tree Tilt
- activemq入门安装启动和配置文件简单讲解
- sql中列名为关键字如何处理