数据结构基础知识

来源:互联网 发布:网络与新媒体 好就业吗 编辑:程序博客网 时间:2024/06/07 09:54

1.n的阶乘
2.河内塔
3.不排序,求无序数组中第k大的数
4.递增链表的插入
5.求集合数据的均方差
6.数列求和
7.装箱问题
8.数组元素循环右移问题
9.两个有序链表序列的合并
10.连个有序链表的交集
11.两个有序序列的中位数

#include <stdio.h>#include <stdlib.h>#include <math.h>void swap(int *a , int *b);int count = 0;int i = 0;//1.n的阶乘void testFactorial();//2.河内塔void testHanoi();//3.不排序,求无序数组中第k大的数void testFindKLargest();//4.递增链表的插入void testInsertNode();//5.求集合数据的均方差void testSumOfSquares();//6.数列求和void testSumOfSequence();//7.装箱问题void testpackboxes();//8.数组元素循环右移问题void testShiftRight();//9.两个有序链表序列的合并void testMergeLinkList();//10.连个有序链表的交集void testIntersectionLinkList();//11.两个有序序列的中位数void testCenterLinkList();int main(int argc, const char * argv[]) {//    testFactorial();//    testHanoi();//    testFindKLargest();//    testInsertNode();//    testSumOfSquares();//    testSumOfSequence();//    testpackboxes();//    testMergeLinkList();//    testIntersectionLinkList();    testCenterLinkList();    return 0;}//1.阶乘问题long int factorial(int n){    if (n == 0) {        return 1;    }else{        return n * factorial(n - 1);    }}/* 2.河内塔(汉诺塔)问题求解 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照 大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小 顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在 三根柱子之间一次只能移动一个圆盘。 */void testFactorial(){    printf("输入一个整数求其阶乘:\n");    int n;    scanf("%d",&n);    long int a = factorial(n);    printf("%ld\n",a);}//将编号为n的盘子由from移动到tovoid mobile(int n,char from,char to){    printf("第%d步:将%d号盘子%c---->%c\n",i++,n,from,to);}/** @param n 要移动盘子的个数 @param from 起始塔 @param denpend_on 借助塔 @param to 目的塔 */void hanoi(int n , char from , char denpend_on, char to){    //把一个盘子从起始塔移动到目标塔    if (n == 1) {        mobile(1, from, to);    }else{        //把n-1个盘子从起始塔借助目的塔移动到借助塔上,这样起始塔上就剩下一个最大盘子        hanoi(n-1, from, to, denpend_on);        /*         把剩下的第n个盘子移动到目的塔上,         这样起始塔上就没有盘子了,当做借助塔用,         借助塔上有n-1个盘子,成为起始塔         */        mobile(n, from, to);        //把n-1个盘子从借助塔 借助 起始塔 移动到 目的塔 上        hanoi(n-1, denpend_on, from, to);    }}void testHanoi(){    printf("请输入盘子的个数:\n");    int n;    scanf("%d",&n);    char x='A',y='B',z='C';    printf("盘子移动情况如下:\n");    hanoi(n,x,y,z);}/** 3.不排序,求一个数组中的K大的数 @param a 数组 @param K 第K大 @param Left 左边个数 @param Right 右边个数 @return 返回的结果 */int findKLargest(int a[] ,int K , int Left , int Right){    int e = a[Left];    int L = Left , R = Right;    while (1) {        while (Left <= Right && e <= a[Left]) {            Left++;        }        while (Left < Right && e > a[Right]) {            Right--;        }        if (Left < Right) {            printf("Left:%d -- Right:%d\n",Left,Right);            swap(&a[Left], &a[Right]);        }else{            break;        }    }    swap(&a[Left - 1], &a[L]);    if (Left - L - 1 >= K) {        return findKLargest(a, K, L, Left - 2);    }else if (Left - L - 1 < K - 1){        return findKLargest(a, K - Left + L, Left, R);    }else{        return e;    }}void testFindKLargest(){    printf("输入长度:\n");    int n;    scanf("%d",&n);    int a[n];    printf("一次输入%d个数\n",n);    for (int i = 0; i < n; i++) {        scanf("%d",&a[i]);    }    printf("\n");    printf("查找第K大 K:\n");    int K;    scanf("%d",&K);    int e = findKLargest(a, K, 0, n - 1);    printf("\n%d\n",e);}/** 4.递增链表的插入 */struct node {    int value;    struct node *next;};void logLinkList(struct node *head){    struct node *p = head;    while (p != NULL) {        printf("%d   ",p->value);        p = p->next;    }    printf("\n");}struct node *insertNode(struct node *head,int k){    struct node *newNode = malloc(sizeof(struct node));    newNode->value = k;    //方法一:在开头先插入一个节点    struct node *tmpHead = malloc(sizeof(struct node));    tmpHead->next = head;    struct node *p = tmpHead;    while (p->next != NULL && p->next->value < k) {        p = p->next;    }    newNode->next = p->next;    p->next = newNode;    if (p == tmpHead) {        head = newNode;    }else{        free(tmpHead);        tmpHead = NULL;    }    return head;    //    struct node *p = head;    //    if (head == NULL) {    //        return newNode;    //    }    //    if (head->value > k) {    //        newNode->next = head;    //        return newNode;    //    }    //    while (p->next != NULL && p->next->value < k) {    //        p = p->next;    //    }    //    newNode->next = p->next;    //    p->next = newNode;    //    return head;}struct node *createLinkList(){    struct node *head = NULL;    struct node *newNode = NULL;    struct node *oldNode = NULL;    printf("输入长度:\n");    int n;    scanf("%d",&n);    if (n == 0) {        return head;    }    newNode = malloc(sizeof(struct node));    printf("一次输入%d个数\n",n);    for (int i = 0; i<n; i++) {        if (head == NULL) {            head = newNode;        }else{            oldNode->next = newNode;        }        oldNode = newNode;        scanf("%d",&oldNode->value);        newNode = malloc(sizeof(struct node));    }    free(newNode);    newNode = NULL;    oldNode->next = NULL;    return head;}void testInsertNode(){    struct node *head = createLinkList();    logLinkList(head);    int k = -1;    while (k != 0) {        printf("输入要插入的数 K:\n");        scanf("%d",&k);        head = insertNode(head, k);        logLinkList(head);    }}/* 5.求集合数据的均方差 */double avg(int a[] , int n){    if (n == 0) {        return 0;    }    double sum = 0;    for (int i = 0; i < n; i++) {        sum += a[i];    }    return sum/(double)n;}double sumOfSquares(int a[] , int n){    double Avg = avg(a, n);    printf("%f\n",Avg);    double sum = 0;    for (int i = 0 ; i < n; i++) {        sum += (a[i] - Avg) * (a[i] - Avg);    }    printf("%f\n",sum);    printf("%f\n",sum/(double)n);    return sqrt(sum/(double)n);}void testSumOfSquares(){    printf("输入长度:\n");    int n;    scanf("%d",&n);    int a[n];    printf("一次输入%d个数\n",n);    for (int i = 0; i < n; i++) {        scanf("%d",&a[i]);    }    //    int a[10] = {6,3,7,1,4,8,2,9,11,5}; 3.03974    double res = sumOfSquares(a, n);    printf("\n%.5f\n",res);}/* 6.给定某整数A(1≤A≤9)以及非负整数N(0≤N≤100 000), 求数列之和 S = A + AA + AAA + ...+ AA...A(N个A)。 例如: S = 1 + 11 + 111 = 123 */int *sumOfTwoArray(int array1[] , int array2[] , int n){    printf("array1:\n");    for (int i = n - 1; i >= 0; i--) {        printf("%d  ",array1[i]);    }    printf("\narray2:\n");    for (int i = n - 1; i >= 0; i-- ){        printf("%d  ",array2[i]);    }    int *res = (int *)malloc(n-1);    int y = 0;    for (int i = 0 ; i < n; i++) {        int e = array1[i] + array2[i] + y;        printf("\n i : %d array1 %d  array2 %d y : %d  e :%d", i ,array1[i], array2[i],y , e);        //        if (i == n - 1) {        //            res[i] = array1[i] + array2[i] + y;        //        }else{        //            res[i] = e%10;        //        }        res[i] = e%10;        y = e/10;    }    printf("\nres:\n");    for (int i = n - 1; i >= 0; i-- ){        printf("%d  ",res[i]);    }    printf("\n");    printf("\n");    return res;}//double pow(double x,double y);void sumOfSequence(int A , int B){    //    int sum = 0;    //    int a = A;    //    for (int i = 0; i < B; i++) {    //        int N = A * (B-i) * pow(10, i);    //        sum += N;    //    }    //    printf("\n%d\n",sum);    //    sum = 0;    //    int tN = 0;    //    for (int i = 1; i <= B; i++) {    //        tN += A;    //        sum += tN;    //        A = A * 10;    //    }    //    printf("\n%d\n",sum);    //    A = a;    int a[B];    int *c = malloc(B - 1);    for (int i = B - 1; i >= 0; i--) {        c[i] = 0;        a[i] = 0;    }    for (int i = 0; i < B; i++) {        for (int j = 0; j <= i; j ++) {            a[j] = A;        }        for (int i = B - 1; i >= 0; i--) {            printf("%d",a[i]);        }        printf("\nc:\n");        for (int i = B - 1; i >= 0; i--) {            printf("%d",c[i]);        }        printf("\n");        c = sumOfTwoArray(a, c, B);    }    printf("\n");    for (int i = B - 1; i >= 0; i--) {        printf("%d",c[i]);    }    printf("\n");}void testSumOfSequence(){    printf("输入A和B的值:\n");    int A , B;    scanf("%d %d",&A , &B);    sumOfSequence(A, B);}/* 7.假设有N(≤1000)项物品,大小分别为s1,s2,s3...si...Sn si是1到100的整数 要把这些物品存放到容量为100的一批箱子中(序号1—N). 装箱方法:对每项物品,书序扫描箱子,把该物品放入足以能够容下它的的 第一个箱子中。请写一个程序模拟这种装箱过程,并输出每个物品所在的箱子 的序号,以及放置全部物品所需的箱子数目。 */void packboxes(int array[][2] , int N){    int box[1000] = {0};    int count = 1;    for (int i = 0; i < N; i++) {        for (int j = 0; j < N; j++) {            if (array[i][0] + box[j] <= 100) {                array[i][1] = j + 1;                box[j] = box[j] + array[i][0];                if (j + 1 > count) {                    count = j + 1;                }                break;            }        }    }    for (int i = 0; i < N; i++) {        printf("%3d %d\n",array[i][0],array[i][1]);    }    printf("\ncount:%d\n",count);}void testpackboxes(){    printf("输入长度:\n");    int n;    scanf("%d",&n);    int a[n][2];    printf("一次输入%d个数\n",n);    int sum = 0;    for (int i = 0; i < n; i++) {        //        scanf("%d",&a[i][0]);        a[i][0] = (rand() % 100) + 1;        sum += a[i][0];        a[i][1] = 0;    }    printf("\nsum:%d\n",sum);    printf("\n");    packboxes(a, n);}/* 8.数组元素循环右移问题 */void shiftOne(int array[] , int n){    int tmp = array[n-1];    for (int i = n - 1; i > 0; i--) {        array[i] = array[i-1];        ++count;    }    array[0] = tmp;}void shiftRight(int array[], int n, int m){    int j = m % n;    for (int i = 0; i < j; i++) {        shiftOne(array, n);    }}void swap(int *a , int *b){//第一种算法//    int c = *a;//    *a = *b;//    *b = c;//第二种算法//    *a = *a^*b;//    *b = *a^*b;//把第一次的结果带进去,就是(*a^*b)^*b,对同一个数异或运算等于自身;//    *a = *a^*b;//把第一次的结果带进去,就是(*a^*b)^*b,此时*b = *a,(*a^*b)^*a//第三种算法    int c = *a - *b;    *a = *a - c;    *b = *b + c;}void shiftRight_2(int array[] , int n, int m){    for (int i = 0 , j = n-1; i < j;i++,j--) {        swap(&array[i], &array[j]);        ++count;    }    m = m % n;    for (int i = 0 , j = m - 1; i < j; i++ , j--) {        swap(&array[i], &array[j]);        ++count;    }    for (int i = m , j = n - 1; i < j; i++ , j--) {        swap(&array[i], &array[j]);        ++count;    }}void shiftRight_3(int array[] , int n, int m){    m = m%n;//    for (int i = 0, j = m;j < n - m; i++ , j++) {//        swap(&array[i], &array[j]);//    }}void testShiftRight(){    int a[6] = {1,2,3,4,5,6};    shiftRight_2(a, 6, 8);    for (int i; i < 6; i++) {        printf("%d\n",a[i]);    }    printf("n=%d\n",count);}/* 9.已知两个非降序链表S1与S2,设计函数构造出S1与S2的并集新非降序链表S3. */struct node *mergeLinkList(struct node *head1, struct node *head2){    if (head1 == NULL) {        return head2;    }    if (head2 == NULL) {        return head1;    }    struct node *p = head1;    while (p != NULL) {        head2 = insertNode(head2, p->value);        p = p->next;    }    return head2;}void testMergeLinkList(){    printf("创建第一个非降序链表\n");    struct node *head1 = createLinkList();    printf("创建第二个非降序链表\n");    struct node *head2 = createLinkList();    struct node *mLink = mergeLinkList(head1, head2);    logLinkList(mLink);}/* 10.已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3. */int hasEqualNode(struct node *head, int k){    struct node *p = head;    while (p != NULL) {        if (p->value == k) {            return 1;        }else{            p = p->next;        }    }    return 0;}struct node *IntersectionLinkList(struct node *head1, struct node *head2){    if (head2 == NULL || head1 == NULL) {        return NULL;    }    struct node *p = head1;    struct node *newNode = NULL;    while (p != NULL) {        if (hasEqualNode(head2, p->value)) {            newNode = insertNode(newNode, p->value);        }        p = p->next;    }    return newNode;}void testIntersectionLinkList(){    printf("创建第一个非降序链表\n");    struct node *head1 = createLinkList();    printf("创建第二个非降序链表\n");    struct node *head2 = createLinkList();    struct node *mLink = IntersectionLinkList(head1, head2);    logLinkList(mLink);}/* 11.已知有两个等长的非降序序列,设计函数S1与S2并集的中位数 */struct node *bingjiLinkList(struct node *head1, struct node *head2){    struct node *p = head1;    while (p != NULL) {        if (hasEqualNode(head2, p->value) == 0) {            head2 = insertNode(head2, p->value);        }        p = p->next;    }    return head2;}void testCenterLinkList(){    printf("创建第一个非降序链表\n");    struct node *head1 = createLinkList();    printf("创建第二个非降序链表\n");    struct node *head2 = createLinkList();    struct node *mLink = bingjiLinkList(head1, head2);    logLinkList(mLink);    struct node *p = mLink;    int count = 0;    while (p != NULL) {        p = p->next;        count++;    }    int i = 0;    int c = (count%2 == 0) ? (count/2 - 1) : count/2;    p = mLink;    while (i < c) {        p = p->next;        i++;    }    printf("中位数:%d\n", p->value);}
0 0
原创粉丝点击