/* 链表的操作 * 实现的功能有: 1.向链表头插入数据2.删除某个数据 3.查找链表中数据 4.正向输出链表5.反向输出链表 6.创建新链表并合并 * 实现代码如下: * */ #include <iostream> using namespace std; struct Node { int data; Node *next; Node *pre; }; class LinkList { public: int size; Node *head = NULL; //链表头结点 LinkList(); //构造方法 ~LinkList(); //析构方法 int length(LinkList *l); //返回链表长度,传入一个链表指针 int getData(LinkList *l, int); //获得链表该位置的内容 Node *Create(int); //创建链表 Node *Insert(int); //向链表头插入数据 Node *Delete(int); //删除链表 void output(); //正向输出链表 void output2(); //反向输出链表 int Find(int); //查找链表中某一节点,返回位置 void changeData(LinkList *l, int a, int index); //改变链表某一位置的值,即将index位置的数据变为a void sort(LinkList *l); //传入某一链表,对该链表进行排序 LinkList* merge(LinkList *l); //合并两链表,返回新链表 }; LinkList::LinkList() { } LinkList *LinkList::merge(LinkList *l) { LinkList *newlist = new LinkList; Node *p = head, *q, *m = newlist->head = NULL; while (p != NULL) { q = new Node; q->data = p->data; if (newlist->head == NULL) { newlist->head = q; q->next = NULL; } else { m->next = q; q->pre = m; q->next = NULL; } m = q; p = p->next; } m->next = l->head; newlist->size = this->size + l->size; return newlist; } void LinkList::changeData(LinkList *list, int a, int index) { if (index < 0 || index > list->size) { cout << "Out of Bounds" << endl; return; } Node *current = new Node; current = list->head; int j = 1; if (index == 1) { current->data = a; } else { while (current->next != NULL) { current = current->next; j++; if (j == index) break; } current->data = a; } } int LinkList::getData(LinkList *list, int index) { if (index < 0 || index > list->size) { cout << "Out of Bounds" << endl; return -1; } Node *current = new Node; int result; current = list->head; int j = 1; if (index == 1) { result = current->data; } else { while (current->next != NULL) { current = current->next; j++; if (j == index) break; } result = current->data; } return result; } void LinkList::sort(LinkList *newlist) { int temp = 0; for (int i = 0; i < newlist->size - 1; i++) { for (int j = i + 1; j < newlist->size; j++) { if (getData(newlist, i + 1) > getData(newlist, j + 1)) { temp = getData(newlist, i + 1); changeData(newlist, getData(newlist, j + 1), i + 1); changeData(newlist, temp, j + 1); } } } } Node* LinkList::Create(int d) { size = d; cout << "请输入" << d << "个元素来创建链表" << endl; Node *p = new Node, *q; p = head; for (int i = 0; i < d; i++) { int input; cin >> input; q = new Node; q->data = input; if (head == NULL) { head = q; q->next = NULL; } else { p->next = q; q->pre = p; q->next = NULL; } p = q; } return head; } Node *LinkList::Insert(int x) { Node *p, *q; p = head; q = new Node; q->data = x; head = q; q->next = p; p->pre = q; size++; return head; } Node *LinkList::Delete(int x) { Node *p1, *p2; p1 = head; if (head == NULL) { cout << "Null List" << endl; return head; } while (p1->data != x && p1->next != NULL) { p2 = p1; p1 = p1->next; } if (p1->data == x) { if (p1 == head) { head = head->next; } else { if (p1->next == NULL) { p2->next = NULL; } else { p1->next->pre = p2; p2->next = p1->next; } } delete p1; } else cout << "Not Found Number:" << endl; size--; return head; } int LinkList::Find(int x) { Node *p; p = head; int index = 1; while (p->data != x && p->next != NULL) { p = p->next; index++; } if (p->data == x) return index; else return 0; } void LinkList::output() { Node *p = head; while (p != NULL) { cout << p->data << " "; p = p->next; } cout << endl; } void LinkList::output2() { Node *p = head; while (p->next != NULL) { p = p->next; } while (p != head) { cout << p->data << " "; p = p->pre; } cout << p->data << " "; cout << endl; } int main() { cout << "请输入第一个链表的大小" << endl; int x; cin >> x; LinkList *a = new LinkList; a->Create(x); cout << "链表为:" << endl; a->output(); while (true) { cout << "您想进行什么操作? 1.向链表头插入数据" "2.删除某个数据 3.查找链表中数据 4.正向输出链表" "5.反向输出链表 6.创建新链表并合并" << endl; int w; cin >> w; switch (w) { case 1: { cout << "请输入要插入的数据" << endl; int data; cin >> data; a->Insert(data); cout << "插入后的链表是" << endl; a->output(); break; } case 2: { cout << "请输入要删除的数据" << endl; int data; cin >> data; a->Delete(data); cout << "删除后的链表:" << endl; a->output(); break; } case 3: { cout << "请输入要查找的数据,会输出它的位置" << endl; int data; cin >> data; int index = a->Find(data); cout << "当前链表为:" << endl; a->output(); if (index == 0) cout << "数字" << data << "不存在" << endl; else cout << "數字" << data << "的位置是" << index << endl; break; } case 4: { cout << "正向输出:" << endl; a->output(); break; } case 5: { cout << "反向输出" << endl; a->output2(); break; } case 6: { cout << "请输入新链表的数据个数" << endl; LinkList *b = new LinkList; int x; cin >> x; b->Create(x); LinkList *c = new LinkList; a->sort(a); cout << "第一个链表:" << endl; a->output(); cout << "第二个链表" << endl; b->sort(b); b->output(); c = a->merge(b); c->sort(c); cout << "合并并排序后新链表如下:" << endl; c->output(); cout << "大小:" << c->size << endl; break; } } } return 0; }
测试样例: /* 请输入第一个链表的大小 5 请输入5个元素来创建链表 4 5 7 9 10 链表为: 4 5 7 9 10 您想进行什么操作? 1.向链表头插入数据2.删除某个数据 3.查找链表中数据 4.正向输出链表5.反向输出链表 6.创建新链表并合并 1 请输入要插入的数据 6 插入后的链表是 6 4 5 7 9 10 您想进行什么操作? 1.向链表头插入数据2.删除某个数据 3.查找链表中数据 4.正向输出链表5.反向输出链表 6.创建新链表并合并 2 请输入要删除的数据 10 删除后的链表: 6 4 5 7 9 您想进行什么操作? 1.向链表头插入数据2.删除某个数据 3.查找链表中数据 4.正向输出链表5.反向输出链表 6.创建新链表并合并 3 请输入要查找的数据,会输出它的位置 7 当前链表为: 6 4 5 7 9 數字7的位置是4 您想进行什么操作? 1.向链表头插入数据2.删除某个数据 3.查找链表中数据 4.正向输出链表5.反向输出链表 6.创建新链表并合并 4 正向输出: 6 4 5 7 9 您想进行什么操作? 1.向链表头插入数据2.删除某个数据 3.查找链表中数据 4.正向输出链表5.反向输出链表 6.创建新链表并合并 5 反向输出 9 7 5 4 6 您想进行什么操作? 1.向链表头插入数据2.删除某个数据 3.查找链表中数据 4.正向输出链表5.反向输出链表 6.创建新链表并合并 6 请输入新链表的数据个数 3 请输入3个元素来创建链表 19 16 22 第一个链表: 4 5 6 7 9 第二个链表 16 19 22 合并并排序后新链表如下: 4 5 6 7 9 16 19 22 大小:8 您想进行什么操作? 1.向链表头插入数据2.删除某个数据 3.查找链表中数据 4.正向输出链表5.反向输出链表 6.创建新链表并合并 */