....快排+链表

来源:互联网 发布: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
原创粉丝点击