
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Timeclimber/article/details/79949530
1.随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。
2.遍历单向链表。
3.把单向链表中元素逆置(不允许申请新的结点空间)。
4.在单向链表中删除所有的偶数元素结点。
5.编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表。
6.利用算法5建立两个非递减有序单向链表,然后合并成一个非递增链表。
7.利用算法5建立两个非递减有序单向链表,然后合并成一个非递减链表。
8.利用算法1建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。
9.在主函数中设计一个简单的菜单,分别调试上述算法。
#include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; typedef int ElemType;//元素类型 typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; void help() { cout<<"1.创建链表"<<endl; cout<<"2.遍历链表元素"<<endl; cout<<"3.把链表中元素逆置"<<endl; cout<<"4.删除链表所有偶数元素节点"<<endl; cout<<"5.在非递减有序链表中插入元素"<<endl; cout<<"6.创建一个非递减有序单向链表"<<endl; cout<<"7.建立两个非递增链表,合并成一个链表"<<endl; cout<<"8.建立两个非递减链表,合并成一个链表"<<endl; cout<<"9.将链表分为节点为奇偶的两个链表"<<endl; cout<<"10.帮助功能"<<endl; cout<<"11.清屏"<<endl; } LinkList creatlist(LinkList head) { printf("请输入创建元素个数:"); int number;//元素个数 cin>>number; LinkList p ,q; q=head; printf("请输入元素:\n"); for(int i=0;i<number;i++) { ElemType tmp; cin>>tmp; p = new LNode(); p->next = NULL; p->data = tmp; q->next = p; q = p; } cout<<"创建成功!"<<endl; return head; } void traversal(LinkList head) { LinkList p = head; p = p->next; while(p!=NULL) { cout<<p->data<<" "; p = p->next; } cout<<endl; } void linkrev(LinkList head) { LinkList p,q; p = head->next; head->next = NULL; while(p) { q = p; p = p->next; q->next = head->next; head->next = q; } return; } void linkdelete(LinkList head) { LinkList p,q; p = head->next,q=head; while(p) { if(!(p->data&1)) { q->next = p->next; delete p; p = q->next; } else { q = p; p = p->next; } } cout<<"已经删除链表中的偶数元素节点"<<endl; } void linkinsert(LinkList head) { ElemType elem; cout<<"请输入插入的元素"<<endl; cin>>elem; LinkList p,q,tmp; tmp = new LNode(); tmp->next = NULL; tmp->data = elem; p=head->next,q=head; while(tmp&&p) { if(p->data >= tmp->data||!p) { tmp->next = q->next; q->next = tmp; tmp=NULL; } else { q = p; p = p->next; } } if(tmp)//如果没有找到比该元素大的节点 { q->next = tmp; } cout<<"已经插入该元素"<<endl; return; } LinkList creatnondeclist() { LinkList head = new LNode(); int num; cout<<"请输入创建的元素个数:"; cin>>num; for(int i=1;i<=num;i++) { linkinsert(head); } cout<<"创建成功!"<<endl; return head; } LinkList mergenoninclist() { int number; LinkList head1 = new LNode(); head1->next = NULL; LinkList head2 = new LNode(); head2->next = NULL; LinkList p,q,w; cout<<"请输入第一个创建链表的元素个数:"; cin>>number; for(int i=1;i<=number;i++) { linkinsert(head1); } cout<<"请输入第二个创建链表的元素个数:"; cin>>number; for(int i=1;i<=number;i++) { linkinsert(head2); } linkrev(head1),linkrev(head2); p = head1,q = head2->next; while(q)//当链表2还有节点的时候 { if(p->next == NULL) { break; } if(q->data >= p->next->data) { w = q->next; q->next = p->next; p->next = q; q = w; } else { p = p->next; } } if(q)//如果链表1还没有被插入完全 { p->next = q; } return head1; } LinkList mergenondeclist() { int number; LinkList head1 = new LNode(); head1->next = NULL; LinkList head2 = new LNode(); head2->next = NULL; LinkList p,q,w; cout<<"请输入第一个创建链表的元素个数:"; cin>>number; for(int i=1;i<=number;i++) { linkinsert(head1); } cout<<"请输入第二个创建链表的元素个数:"; cin>>number; for(int i=1;i<=number;i++) { linkinsert(head2); } p = head1,q = head2->next; while(q)//当链表2还有节点的时候 { if(p->next == NULL) { break; } if(q->data <= p->next->data) { w = q->next; q->next = p->next; p->next = q; q = w; } else { p = p->next; } } if(q)//如果链表1还没有被插入完全 { p->next = q; } return head1; } LinkList linksplit(LinkList head) { LinkList ohead = new LNode(); ohead->next = NULL; LinkList p = head,q = head->next; while(q) { if(!(q->data&1)) { q = q->next; p->next->next = ohead->next; ohead->next = p->next; p->next = q; } else { q = q->next; p = p->next; } } return ohead; } int main() { int op; LinkList head=new LNode(),ohead = new LNode(); head->next = NULL; ohead->next = NULL; help(); while(cin>>op) { switch(op) { case 1: head=creatlist(head); break; case 2: traversal(head); break; case 3: linkrev(head); cout<<"已将链表逆置"<<endl; break; case 4: linkdelete(head); break; case 5: linkinsert(head); break; case 6: head=creatnondeclist(); break; case 7: head=mergenoninclist(); break; case 8: head=mergenondeclist(); break; case 9: ohead=linksplit(head); cout<<"节点数据为奇链表为:"<<endl; traversal(head); cout<<"节点数据为偶链表为:"<<endl; traversal(ohead); break; case 10: help(); break; case 11: system("cls"),help(); break; default : break; } } return 0; }