....快排+链表
来源:互联网 发布:saas软件销售术语 编辑:程序博客网 时间:2024/04/20 14:46
输入两个无序数字列 程序通过排序组成两个有序链表
将两个链表合并成一个有序链表 随后根据输入key值删除链表中的节点
打印多多 详细跟踪排序过程
代码如下:
#include <stdio.h>#include <stdlib.h>#include <string.h>#define MIN(a,b) ((a)<(b))?(a):(b)#define MAX_ARRAY_LEN 256struct link_list{int data;struct link_list *next;};typedef struct link_list node;void print_list(node *linklist){while(linklist){printf("%d->", linklist->data);linklist = linklist->next;}printf("\n");return;}node *linked_list(node *linkA, node *linkB){node *head = NULL;node *p = NULL;node *q = NULL;int data;while(1){if(head == NULL){head = ((linkA->data)<(linkB->data))?(linkA):(linkB);if((linkA->data)<(linkB->data))linkA = linkA->next;elselinkB = linkB->next;q = head;continue;}else{if(q->next == NULL){q->next = (linkA)?(linkA):(linkB);break;}p = ((linkA->data)<(linkB->data))?(linkA):(linkB);q->next = p;q = p;}if((linkA->data)<(linkB->data))linkA = linkA->next;elselinkB = linkB->next;}return head;}node *create_linklist(int array[], int len){int i = 0;node *p = NULL;node *q = NULL;node *head = NULL;while(len--){if(head == NULL){head = (node *)malloc(sizeof(node));head->data = array[i++];q = head;}else{p = (node *)malloc(sizeof(node));p->data = array[i++];q->next = p;p->next = NULL;q = p;}}print_list(head);return head;}void delete_key(node *list, int key){int flag = 0;node *q = list;node *p = q;while(p){if(p->data < key){q = p;p = p->next;continue;}if(p->data == key){flag++;if(list == p){list = list->next;free(q);q = list;p = p->next;continue;}else {q->next = p->next;free(p);p = q->next;continue;}}if(p->data > key)break;}if(flag){printf("find and delete %d node\nlinklist now: ", flag);print_list(list);}elseprintf("no find!\n");return;}void show(int array[], int begin, int end) { int i = 0; for(i=0; i<begin; i++) printf(" "); for(i=begin; i<=end; i++) printf("%4d", array[i]); printf("\n"); } void sort_array(int a[], int begin, int end){int i, j, key = a[begin];if(begin < end){i = begin;j = end;printf("key == %d\n", key);while(i < j){while(i < j && key <= a[j]) j--; a[i] = a[j]; show(a, begin, end); printf("i = %d, j = %d\n", i, j); while(i < j && key >= a[i]) i++; a[j] = a[i]; show(a, begin, end); printf("i = %d, j = %d\n", i, j);}a[i] = key;show(a, begin, end);printf("i = %d, j = %d\n", i, j);sort_array(a, begin, i-1);sort_array(a, j+1, end);}}int _scanf(int a[]){int index = 0;char c;for(; index<MAX_ARRAY_LEN && c!='\n'; index++){scanf("%d", &a[index]);c = getchar();}return index;}int main(void){node *linkA, *linkB, *linkC;int array_a[MAX_ARRAY_LEN], array_b[MAX_ARRAY_LEN], a_len, b_len, key = 0;memset(array_a, 0, MAX_ARRAY_LEN);memset(array_b, 0, MAX_ARRAY_LEN);printf("please enter some numbers for linklist A:\n");a_len = _scanf(array_a);printf("please enter some numbers for linklist B:\n");b_len = _scanf(array_b);printf("Qsorting process A:\n");sort_array(array_a, 0, a_len-1);printf("Qsorting process B:\n");sort_array(array_b, 0, b_len-1);printf("linklist A:\n");linkA = create_linklist(array_a, a_len);printf("linklist B:\n");linkB = create_linklist(array_b, b_len);linkC = linked_list(linkA, linkB);printf("linklist C:\n");print_list(linkC);printf("please input the key value you want to delete:\n");scanf("%d", &key);delete_key(linkC, key);return 0;}
0 0
- 链表 快排
- ....快排+链表
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- 快排
- ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务
- 解决ecshop后台搜索引擎的关键字统计乱码问题
- Oracle中对sequence的操作
- Spring启动卡壳情况:com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getPoolManag…
- Windows下Kettle-7.0集群安装
- ....快排+链表
- 城市问题(Floyd)
- Hibernate与Oracle应用之主键生成
- springMVC+Mybatis框架搭建与 事务管理
- JedisDataException: ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / QUIT allowed in thi
- Hibernate之对象关系映射基础
- python与集体智慧编程学习
- 用hibernate的HQL(面向对象的查询语言)实现模糊查询的3种方式
- redis主从复制之linux环境配置