c++主要程序二

Posted 二白工作室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++主要程序二相关的知识,希望对你有一定的参考价值。

(内含完整代码)
题目:
空链表头插,尾插,将一个结点插入在某个结点之前、之后,以及修改,删除,两个链表连接,链表排序链表逆转,最后存到文件中
分析(设计过程):

结构定义:

T data;

Node* next;

Node* prev;
链表节点,采用模板类,next、prev分别表示前驱节点和后继节点。
Node<T>*head,*tail;
int length;
链表定义,包括一个头节点,一个尾节点,头尾节点皆不存放数据,kength表示链表长度。
Print()方法:
打印所有节点,用于观看链表数据状态。
insertHead方法:
头插方法,新建一个节点,新节点的前驱节点指向头节点,后继节点指向头节点的后继节点,将头节点的后继节点的前驱节点指向新节点,头节点的后继节点指向新节点。
insertTail方法:
尾插方法,新建一个节点,新节点的前驱节点指向尾节点的前驱节点,后继节点指向尾节点,将尾节点的前驱节点的后继节点指向新节点,尾节点的前驱节点指向新节点。
voidinsertNext(int i,T data);
插入到第i个元素后的方法,首先定位到第i个节点处,之后新建一个节点,新节点的前驱节点指向第i个节点,后继节点指向i节点的后继节点,将i节点的后继节点指向新节点,新节点的后继节点的前驱节点指向新节点。
voidinsertPrev(int i,T data);
插入到第i个元素前的方法,直接调用insertNext方法并将i-1即可,因为有头尾节点,所以不会出现异常情况。
voidremove(int i);
删除第i个节点,先定位到第i个节点处,将i的前驱节点的后继节点指向i节点的后继节点,然后删除i节点即可。
voidadd(List<T>& list);
添加链表方法,遍历第二个链表,对每个元素调用insertTail方法即可。
void sort();
排序方法,二重循环,采用冒泡排序的方式进行排序。
void reverse();
翻转链表,从头节点开始遍历链表,遍历每个节点时将前驱节点和后继节点互换,最后将头尾节点交换。
voidsave(string path);
保存文件,顺序遍历链表,将每个元素写入文件即可。
完整源代码:
#include<bits/stdc++.h>using namespace std;template<typename T>class Node{ public: T data; Node* next; Node* prev; Node(T in){ data = in; next = NULL; prev = NULL; }; Node(){ next = NULL; prev = NULL; }};template<typename T>class List{ public: Node<T>* head,*tail; int length; List<T>(); void print(); void insertHead(T data); void insertTail(T data); void insertNext(int i,T data); void insertPrev(int i,T data); void remove(int i); void add(List<T>& list); void sort(); void reverse(); void save(string path);};template<typename T>List<T>::List(){ head = new Node<T>(); tail = new Node<T>(); head->next = tail; tail->prev = head; length = 0;}template<typename T>void List<T>::insertHead(T data){ Node<T>* now = new Node<T>(data); now->next = head->next; now->prev = head; head->next->prev = now; head->next = now; length++;}template<typename T>void List<T>::insertTail(T data){ Node<T>* now = new Node<T>(data); now->next = tail; now->prev = tail->prev; tail->prev->next = now; tail->prev = now; length++;}template<typename T>void List<T>::insertNext(int loc,T data){ if(loc<0){ cout<<"非法访问"<<endl; return ; } Node<T>* now = new Node<T>(data); Node<T>* flag = head; for(int i=0;i<loc;i++){ flag = flag->next; if(flag == tail){ cout<<"非法访问"<<endl; return ; } } now->next = flag->next; now->prev = flag; flag->next->prev = now; flag->next = now; length++;}template<typename T>void List<T>::insertPrev(int loc,T data){ insertNext(loc-1,data);}template<typename T>void List<T>::remove(int loc){ if(loc>length){ cout<<"非法访问"<<endl; return ; } Node<T>* now = head; for(int i=0;i<loc;i++){ now = now->next; } now->prev->next = now->next; length--; delete now;}template<typename T>void List<T>::add(List<T>& list){ Node<T>* now = list.head->next; for(int i=0;i<list.length;i++){ insertTail(now->data); now = now->next; }}template<typename T>void List<T>::print(){ Node<T>* now = head->next; for(int i=0;i<length;i++){ cout<<now->data<<" "; now = now->next; } cout<<endl;}template<typename T>void List<T>::sort(){ for(int i=length;i>=0;i--){ Node<T>* now = head->next; Node<T>* next = now->next; for(int j=1;j<i;j++){ if(now->data>next->data){ swap(now->data,next->data); } now = now->next; next = now->next; } }}template<typename T>void List<T>::reverse(){ Node<T>* now = head; Node<T>* next; for(int i=0;i<=length+1;i++){ next = now->next; now->next = now->prev; now->prev = next; now = next; } swap(head,tail);}template<typename T>void List<T>::save(string path){ ofstream fout(path); Node<T>* now = head->next; for(int i=0;i<length;i++){ fout<<now->data<<" "; } cout<<endl; fout.close();}
int main(){ List<int> list,list2; list.insertHead(1); list.insertHead(2); list.insertHead(3); cout<<"list1头插入1、2、3,尾插入4\n"; list.insertTail(4); list.print(); cout<<"list1第一个元素前插入1\n"; list.insertPrev(1,1); list.print(); cout<<"list1第一个元素后插入2\n"; list.insertNext(1,2); list.print(); cout<<"list1移除第一个元素\n"; list.remove(1); list.print(); cout<<"list2尾插入0、1、2、3\n"; for(int i=0;i<=3;i++){ list2.insertTail(i); } list.add(list2); list2.print(); cout<<"list1增加集合2\n"; list.print(); cout<<"list1排序\n"; list.sort(); list.print(); cout<<"list1翻转\n"; list.reverse(); list.print(); return 0;}
运行结果:





以上是关于c++主要程序二的主要内容,如果未能解决你的问题,请参考以下文章

C零基础视频-26-身份证号校验程序

OpenGL基础学习之二代码基本结构

为什么二代测序的原始数据中会出现Read重复现象?

二代身份证号码编码规则

二代旅游网站程序管理系统V1.0正式发布啦

染色体基因芯片分析和第二代测序应用的区别