//头文件
#ifndef LIST_H
#define LIST_H
#include
#include
using namespace std;
template
class LinkNode{
public:
T data;
LinkNode
* link;
LinkNode()
{
}
LinkNode(const T& item,LinkNode
*ptr=NULL){ data = item; link = ptr; } }; template
class List{ private: LinkNode
* head; LinkNode
* currPos; public: List(); ~List(); void Append(const T value);//为链表赋值,规定链表长度 void clear(); void print(); void HeadToTail();//将链表倒置 //最大值,节点数,平均值 T MaxValue(); int Count(); T Average(); //合并链表 void AppendIncre(const T value); void Merge(List
& ptr);//合并两个已排序的链表 }; template
void List
::AppendIncre(const T value) { if (head == NULL) { head = new LinkNode
(value); currPos = head; } else { LinkNode
* p = currPos; if (value < (p->data)) { return ; } p->link = new LinkNode
(value); p = p->link; p->link = NULL; currPos = p; } } template
void List
::Merge(List
& ptr) { LinkNode
* pa = head; LinkNode
* pb = ptr.head; //由于链表不带头结点,所以先比较第一个数据的大小,从而确定合并后的链表的头指针的位置 LinkNode
* pd = (pa->data >= pb->data) ? pa : pb; LinkNode
* p = new LinkNode
(pd->data); LinkNode
* pHead = p; if (p->data == pa->data) pa = pa->link; else { pb = pb->link; delete ptr.head; ptr.head = pb; } while (pa&&pb) { if (pa->data >= pb->data) { p->link = new LinkNode
(pa->data); p = p->link; pa = pa->link; } else { p->link = new LinkNode
(pb->data); p = p->link; pb = pb->link; //删除ptr的空间 delete ptr.head; ptr.head = pb; } } if (pa) { while (pa) { p->link = new LinkNode
(pa->data); p = p->link; pa = pa->link; } } else { while (pb) { p->link = new LinkNode
(pb->data); p = p->link; pb = pb->link; //删除ptr的空间 delete ptr.head; ptr.head = pb; } } p->link = NULL; //删除调用该函数的链表的原空间 clear(); head = pHead; } //最大值,节点数,平均值 template
T List
::MaxValue() { T maxValue = 0; LinkNode
* p = head; while (p != NULL) { if (maxValue < (p->data)) maxValue = p->data; p = p->link; } return maxValue; } template
int List
::Count() { int count = 0; LinkNode
* p = head; while (p != NULL) { p = p->link; count++; } return count; } template
T List
::Average() { T average = 0; T sum = 0; LinkNode
* p = head; while (p != NULL) { sum += (p->data); p = p->link; } return average = (sum / Count()); } template
List
::List() { //默认构造函数 head = NULL; currPos = NULL; } template
List
::~List() { clear(); } template
void List
::Append(const T value) { if (head == NULL) { head = new LinkNode
(value); currPos = head; } else { LinkNode
* p = currPos; p->link = new LinkNode
(value); p = p->link; p->link = NULL; currPos = p; } } template
void List
::clear() { LinkNode
* p = head; while (p != NULL) { p = p->link; delete head; head = p; } } template
void List
::print() { LinkNode
* p = head; while (p != NULL) { cout << p->data << " "; p = p->link; } cout << endl; } template
void List
::HeadToTail() { int top = -1; stack
temp; LinkNode
* p = head; while (p != NULL) { temp.push(p->data); p = p->link; } p = head; while (p != NULL) { p->data = temp.top(); p = p->link; temp.pop(); } } #endif //主函数 #include"List.h" int main(int argc, char argv[]) { List
list; List
list1; int count; cout << "请输入单链表的长度:"; cin >> count; /*int value; for (int i = 0; i < count; i++) { cin >> value; list.Append(value); }*/ int value; for (int i = 0; i < count; i++) { cin >> value; list.AppendIncre(value); } for (int i = 0; i < count; i++) { cin >> value; list1.AppendIncre(value); } /*list.print(); list.HeadToTail(); list.print();*/ /*int maxValue = list.MaxValue(); cout << "最大值:" << maxValue << endl; int listCount = list.Count(); cout << "链表的节点数:" << listCount << endl; int average = list.Average(); cout << "平均数:" << average << endl;*/ list.print(); list.HeadToTail(); list.print(); list1.HeadToTail(); list.Merge(list1); list.print(); return 0; }
设A和B是两个单链表,其表中元素递增有序,使用一算法将A和B归并成一个案元素递减有序的单链表C(该程序中的功能包含了上几个博客中的部分功能)
最新推荐文章于 2023-04-04 12:23:18 发布