数据结构——链表的基本操作
来源:互联网 发布:mysql unixtime 转换 编辑:程序博客网 时间:2024/06/07 05:14
怎么说呢? 这个代码是好久之前学链表时写的,在codeblocks上编译通过了,以前测试过了,现在没测试就直接复制到上面,有什么问题欢迎指正,O(∩_∩)O谢谢
具体代码如下:
#include<bits/stdc++.h>#define N 1009using namespace std;typedef struct Node{ int data; struct Node *next;}Lnode, *LinkList;void menu(){ printf("\t\t\t 单链表基本操作\n\n"); printf("\t\t\t1.建 立 单 链 表\n"); printf("\t\t\t2.遍 历 单 链 表\n"); printf("\t\t\t3.计 算 链 表 长 度\n"); printf("\t\t\t4.链 表 逆 置\n"); printf("\t\t\t5.删 除 偶 数 节 点\n"); printf("\t\t\t6.生 成 值 有 序 单 链 表\n"); printf("\t\t\t7.合 并 生 成 降 序 链 表\n"); printf("\t\t\t8.合 并 生 成 升 序 链 表\n"); printf("\t\t\t9.分 解 链 表\n"); printf("\t\t\t0.退 出\n\n");}/*初始化空表*/bool Init_Linklist(LinkList &L){ L=(LinkList)malloc(sizeof(Lnode)); if(!L) return false; L->next=NULL; return true;}/*尾插法建立单链表*/bool Creat_Linklist(LinkList &L){ int x; LinkList p,rear; Init_Linklist(L); rear = L; printf("输入-1表示输入结束\n"); while(scanf("%d",&x),x != -1) { p = (LinkList)malloc(sizeof(Lnode)); if(!p) return false; p->data = x; rear->next = p; rear = p; } rear->next = NULL; return true;}/*单链表遍历*/void Disp_Linklist(LinkList L){ LinkList p; p = L->next; while(p) { printf("%d ", p->data); p = p->next; } printf("\n");}/*计算单链表长度*/int length_Linklist(LinkList L){ int count = 0; /*count表示单链表长度*/ LinkList p; p = L->next; while(p) { count++; p = p->next; } return count;}/*单链表逆置*/void Reverse_Linklist(LinkList L){ LinkList p, q, tm; p = L->next; q = p->next; if(!q) return ; p->next = NULL; while(q) { tm = q->next; q->next = p; p = q; if(!tm) break; q = tm; } L->next = q;}/*删除值为偶数的结点*/void DelEven_Linklist(LinkList L){ LinkList p, q; p = L; q = p->next; while(q) { if(!(q->data&1)) { p->next = q->next; free(q); q = p->next; continue; } p = q; q = q->next; }}/*在有序单链表中插入元素,链表仍然有序,插入成功返回true,插入失败返回false*/bool Insert_Linklist(LinkList L, int x){ LinkList p, q; p = L; q = p->next; while(q) { if(q->data > x) { LinkList s = (LinkList)malloc(sizeof(Lnode)); s->data = x; s->next = q; p->next = s; return true; } p = q; q = q->next; } LinkList s = (LinkList)malloc(sizeof(Lnode)); s->data = x; s->next = NULL; p->next = s; return true;}/*创建非递减有序单链表,创建成功返回true,创建失败返回false*/bool CreatOrder_Linklist(LinkList &L){ int x; printf("请输入有序链表,以文件尾结尾\n"); Init_Linklist(L); while(~scanf("%d", &x))Insert_Linklist(L, x); return true;}/*两个非递减有序单链表La和Lb合并成一个非递增有序链表Lc*/void MergeDescend_Linklist(LinkList La, LinkList Lb, LinkList &Lc){ LinkList a, b, c, cur; a = La->next; b = Lb->next; c = Lc = La; c->next = NULL; while(a&&b) { if(a->data > b->data) { cur = b->next; b->next = c->next; c->next = b; b = cur; continue; } cur = a->next; a->next = c->next; c->next = a; a = cur; } while(a) { cur = a->next; a->next = c->next; c->next = a; a = cur; } while(b) { cur = b->next; b->next = c->next; c->next = b; b = cur; }}/*两个非递减有序单链表La和Lb合并成一个非递减有序链表Lc*/void MergeAscend_Linklist(LinkList La, LinkList Lb, LinkList &Lc){ LinkList pa, pb, pc; pa = La->next; pb = Lb->next; pc = Lc = La; while(pa && pb) { if(pa->data <= pb->data) { pc->next = pa; pc = pa; pa = pa->next; } else { pc->next = pb; pc = pb; pb = pb->next; } } pc->next = pa ? pa : pb; free(Lb);}/*链表La按值分解成两个链表,La全部为奇数,Lb全部为偶数*/void Split_Linklist(LinkList La, LinkList &Lb){ LinkList p, q, b; p = La; q = p->next; b = Lb = La; while(q) { if(q->data&1) continue; b->next = q; b = q; p->next = q->next; q = q->next; }}int main(){ int choice, length; LinkList L, La, Lb, Lc; while(1) { menu(); printf("选择你的操作:"); scanf("%d",&choice); switch(choice) { case 1: if(Creat_Linklist(L)) printf("单链表创建成功\n"); else printf("单链表创建失败\n"); break; case 2: Disp_Linklist(L); break; case 3: length = length_Linklist(L); printf("单链表长度为:%d\n",length); break; case 4: Reverse_Linklist(L); printf("逆置后的链表为:\n"); Disp_Linklist(L); break; case 5: DelEven_Linklist(L); printf("新链表为:\n"); Disp_Linklist(L); break; case 6: if(CreatOrder_Linklist(L)) { printf("值有序链表为:\n"); Disp_Linklist(L); } else printf("单链表创建失败\n"); break; case 7: CreatOrder_Linklist(La); CreatOrder_Linklist(Lb); MergeDescend_Linklist(La, Lb, Lc); printf("合并后的新链表为:\n"); Disp_Linklist(Lc); break; case 8: CreatOrder_Linklist(La); CreatOrder_Linklist(Lb); MergeAscend_Linklist(La, Lb, Lc); printf("合并后的新链表为:\n"); Disp_Linklist(Lc); break; case 9: Creat_Linklist(L); Split_Linklist(L, Lb); printf("分裂后的新链表为:\n"); Disp_Linklist(L); Disp_Linklist(Lb); break; case 0: return 0; default: printf("输入错误,请重新输入\n"); } }}
阅读全文
1 0
- 数据结构——链表的基本操作
- 数据结构—(1)链表的基本操作
- 数据结构 链表的基本操作
- 数据结构:链表的基本操作
- 数据结构--二叉链表的基本操作
- 【数据结构】链表的基本操作
- 数据结构之链表的基本操作
- C++数据结构 链表的基本操作
- 双向链表的基本操作-数据结构
- 【数据结构】链表的基本操作
- 【数据结构】双向链表的基本操作
- 《数据结构》双向链表的基本操作
- 数据结构-链表的基本操作实现
- 数据结构-链表的基本操作
- 数据结构 链表的基本操作
- 数据结构——图的基本操作
- 数据结构——单链表的基本操作
- 数据结构——栈的基本操作
- phpmyadmin安装配置以及相关问题
- GNU的g++编译器备忘
- java冒泡排序
- 浅谈用Java微信公众号开发时向微信服务器发送JSON数据包返回47001错误码问题
- 微服务架构概念
- 数据结构——链表的基本操作
- Linux命令基础24-userdel命令
- 产生冠军
- 51 nod 1091 线段的重叠
- 试设计一个窗口,内含一个按钮。开始运行时,按钮显示“Click Me”字样,当按钮按下时,按钮显示为“Click Me Again”字样,再按一次,则按钮显示“Click Me”字样,依此循环。
- linux locate
- Oil Deposits HDU
- Android Framework学习(十二)之获取ServiceManager
- Code Vs-problem-1057 津津的储蓄计划