单链表的各种操作
2016-05-29 21:35
363 查看
#include <stdio.h> #include <stdlib.h> typedef struct { char data; struct Node * next; }Node, *LinkList; void meau(); LinkList CreateFromHead(); void ListLength(LinkList L); void printLink(LinkList L); LinkList inversePermutation(LinkList L); LinkList sortAscend(LinkList L); LinkList MergeLinkList(LinkList LA, LinkList LB); LinkList MergeCreateLink(LinkList L, char ch); LinkList MergeDeleteLink(LinkList L, char ch); int main() { LinkList L,head; printf("请输入您要插入的单链表 L 的元素:> "); L = CreateFromHead(); int inter; do { meau(); printf("请输入您要执行的功能:> "); scanf_s("%d", &inter); switch (inter) { case 1: { ListLength(L); break; } case 2: { L = inversePermutation(L); printLink(L); break; } case 3: { L = sortAscend(L); printLink(L); break; } case 4: { printf("请输入您要插入的单链表 head 的元素:> "); getchar(); /*消除回车的影响*/ head = CreateFromHead(); L = MergeLinkList(L, head); printLink(L); break; } case 5: { printf("请输入您要插入的元素:>"); char ch; getchar(); /*消除回车的影响*/ ch = getchar(); L = MergeCreateLink(L, ch); printLink(L); break; } case 6: { printf("请输入您要删除的元素:> "); char ch; getchar(); /*消除回车的影响*/ ch = getchar(); L = MergeDeleteLink(L, ch); printLink(L); break; } case 0: { printf("感谢使用本系统,欢迎您的下次使用!\n"); break; } default: { printf("请输入正确的功能编号!\n"); break; } } } while (inter); system("pause"); return 0; } void meau() { printf("1、单链表遍历,求链表长度\n"); printf("2、单链表元素逆置\n"); printf("3、建立非递减有序单链表\n"); printf("4、合并成非递减链表\n"); printf("5、在非递减有序单链表中插入元素\n"); printf("6、在非递减有序链表中删除值为x的结点\n"); printf("0、退出系统\n"); } /*输出单链表*/ void printLink(LinkList L) { Node *p; p = L->next; printf("执行完后单链表为:> "); while (p != NULL) { printf("->%c", p->data); p = p->next; } printf("\n"); } /*尾插法*/ LinkList CreateFromHead() { char c; int flag = 1; Node *s; Node *L, *r; L = (LinkList)malloc(sizeof(Node)); L->next = NULL; r = L; while (flag) { c = getchar(); if (c != '\n') { s = (Node *)malloc(sizeof(Node)); s->data = c; r->next = s; r = s; } else { flag = 0; r->next = NULL; } } return L; } /*通过求链表的长度遍历链表*/ void ListLength(LinkList L) { int len = 0; Node *p; p = L->next; while (p != NULL) { len++; p = p->next; } printf("\n此单链表的长度为:len=%d\n", len); } /*头插法实现单链表逆置*/ LinkList inversePermutation(LinkList L) { Node *p, *s; p = L->next; L->next = NULL; while (p != NULL) { s = p->next; p->next = L->next; L->next = p; p = s; } return L; } /*实现单链表元素升序排列*/ LinkList sortAscend(LinkList L) { Node *p, *q; char ch; p = L->next; while (p->next != NULL) { q = p->next; while (q != NULL) { if (p->data > q->data) { ch = p->data; p->data = q->data; q->data = ch; } q = q->next; } p = p->next; } return L; } /*合并有序单链表*/ LinkList MergeLinkList(LinkList LA, LinkList LB) { LinkList LC; Node *pa, *pb, *pc; pa = LA->next; pb = LB->next; LC = LA; LC->next = NULL; pc = LC; while (pa != NULL&&pb != NULL) { if (pa->data <= pb->data) { pc->next = pa; pc = pa; pa = pa->next; } else { pc->next = pb; pc = pb; pb = pb->next; } } if (pa != NULL) { pc->next = pa; } else { pc->next = pb; } free(LB); sortAscend(LC); return LC; } /*在有序单链表中插入元素*/ LinkList MergeCreateLink(LinkList L, char ch) { Node *p, *q, *s; p = L; q = p->next; s = (Node *)malloc(sizeof(Node)); s->data = ch; while ((q != NULL) && (q->data < ch)) { p = p->next; q = p->next; } s->next = p->next; p->next = s; return L; } /*删除有序单链表中的某个元素*/ LinkList MergeDeleteLink(LinkList L, char ch) { Node *p, *q, *s; int flag = 0; p = L; q = p->next; while (q != NULL) { if (q->data == ch) { flag = 1; p->next = q->next; } else { p = p->next; } q = q->next; } if (flag == 0) printf("没找到您要删除的元素!\n"); return L; }执行代码部分截屏:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/74/D9/wKioL1YsY_ujYfBmAAFVi0zOfPc665.jpg" style="float:none;" title="1.png" alt="wKioL1YsY_ujYfBmAAFVi0zOfPc665.jpg" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/74/DC/wKiom1YsY8vC2LeIAADpmXRlvfM690.jpg" style="float:none;" title="2.png" alt="wKiom1YsY8vC2LeIAADpmXRlvfM690.jpg" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/74/D9/wKioL1YsY_yjN9aLAADbv8qN5dw263.jpg" style="float:none;" title="3.png" alt="wKioL1YsY_yjN9aLAADbv8qN5dw263.jpg" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/74/DC/wKiom1YsY8yzZ_1mAAEJq-0i_Z0169.jpg" style="float:none;" title="4.png" alt="wKiom1YsY8yzZ_1mAAEJq-0i_Z0169.jpg" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/74/D9/wKioL1YsY_yAgCysAAENevHmjos846.jpg" style="float:none;" title="5.png" alt="wKioL1YsY_yAgCysAAENevHmjos846.jpg" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/74/DC/wKiom1YsY8zRe9hjAAEMIplVVN0211.jpg" style="float:none;" title="6.png" alt="wKiom1YsY8zRe9hjAAEMIplVVN0211.jpg" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/74/D9/wKioL1YsY_3S1JuLAADIXF0AjBM615.jpg" style="float:none;" title="8.png" alt="wKioL1YsY_3S1JuLAADIXF0AjBM615.jpg" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/74/DC/wKiom1YsY83Ag1bhAADtzQ1vuXA715.jpg" style="float:none;" title="0.png" alt="wKiom1YsY83Ag1bhAADtzQ1vuXA715.jpg" />
相关文章推荐
- 替换字符串中的空格
- 一组数中,只有两个数只出现了奇数次,其他所有数都是成对出现的,请找出那两个数
- 冒泡排序函数,可以给任意类型的数据排序,比如整形数组,字符数组,字符串数组等
- 快速排序函数的比较函数
- 二叉树 的先序 中序、后序遍历、层次遍历以及树状打印等操作
- C语言利用结构体实现一个通讯录
- C语言的注释与C++注释的转换
- 两个链表的合并
- 单链表的操作
- 单继承与多继承中的虚函数表和虚函数指针
- C++虚继承中的对象内存布局
- 大道至简阅读笔记01
- shell(十一)切割文件
- [DP] BZOJ 1270 [BeijingWc2008]雷涛的小猫
- HttpClient get请求在HttpResponse中无法获得Location的问题
- 循环
- 天梯匹配系统 - 简单实现
- [平衡树动态维护凸包] BZOJ 2300 [HAOI2011]防线修建
- hdu 4607(树的直径)
- 学习进度条13