zoukankan      html  css  js  c++  java
  • Road to Coder _LinkList

    周次

    学习时间

    新编写代码行数

    博客量(篇)

    学到知识点

             

    第6周

    约400

    1

    单链表操作

    #include"stdio.h"
    #include "stdafx.h"
    #include"stdlib.h"
    #include"windows.h"
    
    
    #pragma warning(disable :4996)
    
    typedef int Elemtype;
    
    typedef struct Node
    {
        Elemtype date;
        struct Node* next;
    
    }Node, *LinkList;
    
    int ListLength(LinkList L);                                        //计算链表长度
    void InitList(LinkList L);                                        //初始化列表
    void CreateFromHead(LinkList L);                                //头插法创建单链表
    void CreateFromTail(LinkList L);                                //尾插法创建单链表
    void SearchDate(LinkList L, Elemtype e);                        //单链表查找_按内容
    void Searchsequ(LinkList L, int e);                                //单链表查找_按序号
    void Insert(LinkList L, int local, Elemtype e);                    //单链表插入
    void Myprint(LinkList L);                                        //单链表输入函数
    void MyprintLC(LinkList L);                                        //合并链表后的LC的输出函数
    int DelList(LinkList L, int local);                                //删除
    void mergeLinkList(LinkList LA, LinkList LB, int len);            //合并链表
    void Reverse(LinkList L);                                        //头插法逆置
    void Divide(LinkList L);
    
    int main()
    {
        LinkList head;
        LinkList LB;
        int i;
        head = (Node*)malloc(sizeof(Node));
        LB = (Node*)malloc(sizeof(Node));
        head->next = NULL;
        LB->next = NULL;
        InitList(head);
        //CreateFromHead(head);
        CreateFromTail(head);
        Myprint(head);
        printf("
    逆置算法:");
        Reverse(head);
        Myprint(head);
    
        printf("
    拆分算法:
    ");
        Divide(head);
        /*
        Elemtype seek = 0;
        printf("
    请输入查找的数值:");
        scanf("%d", &seek);
        SearchDate(head, seek);
        printf("
    请输入查找的数值的序号:");
        scanf("%d", &seek);
        Searchsequ(head, seek);
        */
        int local;
        int insertelem;
        printf("
    请输入要插入的位置和值:");
        scanf("%d%d", &local, &insertelem);
        Insert(head, local, insertelem);
        Myprint(head);
        Elemtype *e = 0;
    
        int result = -1;
        printf("
    请输入要删除的函数的序号:");
        scanf("%d", &local);
        result = DelList(head, local);
        if (result != 0)
        {
            printf("
    删除成功!删除的元素为%d
    ", result);
        }
        else
            printf("
    删除失败,删除位置不合法!
    ");
    
        printf("
    LA:	");
        Myprint(head);
        /*            //头插法
        Node *r;
        Elemtype temp;
        printf("请输入时按从大到小的顺序输入,为了后面的合并排序功能,因为只能合并2个升序链表");
        printf("
    请输入LB的的值(数量与LA一致):");
        result = ListLength(head);
        for (i = 0; i < result; i++)
        {
        scanf("%d", &temp);
        r = (Node*)malloc(sizeof(Node));
        r->date = temp;
        r->next = LB->next;
        LB->next = r;
        }
        */
        Node *r, *s;
        Elemtype temp;
        r = LB;
        //printf("请输入时按从大到小的顺序输入,为了后面的合并排序功能,因为只能合并2个升序链表");
        printf("
    请输入LB的的值(数量与LA一致):");
        result = ListLength(head);
        for (i = 0; i < result; i++)
        {
            scanf("%d", &temp);
    
            s = (Node*)malloc(sizeof(Node));
            s->date = temp;
            r->next = s;
            r = s;
        }
        r->next = NULL;
        printf("
    LB:	");
        Myprint(LB);
        printf("
    
    按任意键进入合并单链表!");
        system("pause");
    
        mergeLinkList(head, LB, result);
        system("pause");
        return 0;
    }
    
    void InitList(LinkList L)
    {
        L = (Node*)malloc(sizeof(Node));
        L->next = NULL;
    }
    void CreateFromHead(LinkList L)                        //头插法建表
    {
        printf("
    ");
        printf("------------------------------ 单链表练习 --------------------------------------
    ");
        Node *s;
        int  date;
        int flag = 1;
        printf("
    请输入若干个整数(按0结束):");
        while (flag)
        {
            scanf("%d", &date);
            if (date != 0)            //按0退出
            {
                s = (Node*)malloc(sizeof(Node));
                s->date = date;
                s->next = L->next;
                L->next = s;
            }
            else
                flag = 0;
        }
    }
    void CreateFromTail(LinkList L)
    {
        printf("
    ");
        printf("------------------------------ 单链表练习 --------------------------------------
    ");
        Node *r, *s;
        int date;
        int flag = 1;
        r = L;
        printf("
    请输入若干个整数(按0结束):");
        while (flag)
        {
            scanf("%d", &date);
            if (date != 0)
            {
                s = (Node*)malloc(sizeof(Node));
                s->date = date;
                r->next = s;
                r = s;
            }
            else
            {
                flag = 0;
                r->next = NULL;
            }
        }
    }
    
    void SearchDate(LinkList L, Elemtype e)                //按内容查找
    {
        Node*p;
        p = L->next;
        while (p != NULL)
        {
            if (p->date == e)
                break;
    
            p = p->next;
        }
        if (p == NULL)
            printf("No Find
    ");
        else
            printf(" Find
    ");
    }
    
    void Searchsequ(LinkList L, int e)                //按序号查找
    {
        Node*p;
        p = L;
        int i;
        for (i = 0; i < e; i++)
        {
            p = p->next;
        }
        if (p == NULL)
        {
            printf("查找位置不合法!");
        }
        else
            printf("第%d个元素是%d
    ", e, p->date);
    }
    
    void Insert(LinkList L, int local, Elemtype e)            //插入函数
    {
        Node *s;
        s = (Node*)malloc(sizeof(Node));
        s->date = e;
    
        Node *p;
        p = L;
        int i;
        for (i = 1; i < local; i++)
        {
            p = p->next;
        }
        s->next = p->next;
        p->next = s;
    
    
    }
    
    void Myprint(LinkList L)                //输出函数
    {
        Node *p;
        p = L;
        p = p->next;
        int i;
        int count = ListLength(L);
        for (i = 0; i < count; i++)
        {
            printf("%d	", p->date);
            p = p->next;
        }
    }
    void MyprintLC(LinkList L)                //输出函数
    {
        Node *p;
        p = L;
        p = p->next;
        int i;
        int count = ListLength(L);
        while (p != NULL)
        {
            printf("%d	", p->date);
            p = p->next;
        }
    }
    int ListLength(LinkList L)                //单链表长度
    {
        int count = 0;
        Node *p;
        p = L;
        p = p->next;
        while (p != NULL)
        {
            count++;
            p = p->next;
        }
        return count;
    }
    
    int DelList(LinkList L, int local)
    {
        Node *p, *r;
        int i;
        p = L;
        Elemtype e;
        for (i = 1; i < local; i++)
        {
            if (p->next == NULL)
            {
                return 0;
            }
            p = p->next;
        }
    
        r = p->next;
        p->next = r->next;
        e = r->date;
        free(r);
        return e;
    }
    
    void mergeLinkList(LinkList LA, LinkList LB, int len)            //合并链表
    {
        Node *pa, *pb, *r;
        LinkList LC;
        int i;
        pa = LA->next;
        pb = LB->next;
    
        LC = LA;
        LC->next = NULL;
        r = LC;
    
        while (pa != NULL && pb != NULL)
        {
            if (pa->date <= pb->date)
            {
                r->next = pa;
                r = pa;
                pa = pa->next;
            }
            else
            {
                r->next = pb;
                r = pb;
                pb = pb->next;
            }
            if (pa)
                r->next = pa;
            else
                r->next = pb;
        }
        MyprintLC(LC);
    }
    
    
    void Reverse(LinkList L)
    {
        Node *p,*s;
        LinkList LB;
        int count = 0,i;
        LB=(Node*)malloc(sizeof(Node));
        LB->next = NULL;
        p = L;
        count = ListLength(L);
        for (i = 0;i < count;i++)
        {
            p = p->next;
            s = (Node*)malloc(sizeof(Node));
            s->date = p->date;
            s->next = LB->next;
            LB->next = s;
        }
        p = L;
        for (i = 0;i < count;i++)
        {
            p = p->next;
            LB = LB->next;
            p->date = LB->date;
        }
        free(LB);
    }
    
    
    void Divide(LinkList L)
    {
        int i,count;
        Node *p,*pa,*pb;
        LinkList LA, LB;
        LB = (Node*)malloc(sizeof(Node));
        LB->next = NULL;
        p = L->next;
        LA = L;
        LA->next = NULL;
        pa = LA;
        pb = LB;
    while(p!=NULL)
    {
        if (p->date % 2 == 0)
        {
            pb->next = p;
            pb = p;
            p = p->next;
        }
        else
        {
            pa->next = p;
            pa = p;
            p = p->next;
        }
    }
        pa->next = NULL;
        pb->next = NULL;
        printf("
    LA:");
        count = ListLength(LA);
        pa = LA->next;
        pb = LB->next;
        for (i = 0;i < count;i++)
        {
            printf("%d	",pa->date);
            pa = pa->next;
        }
        printf("
    LB:");
        count = ListLength(LB);
    
        for (i = 0;i < count;i++)
        {
            printf("%d	", pb->date);
            pb = pb->next;
        }
        system("pause");
    }
  • 相关阅读:
    一往直前!贪心法
    Longest subarray of target sum
    动态规划-最长公共子序列/最长公共子串
    Short Encoding of Words
    Spiral Matrix
    Longest Repeating Character Replacement
    伤怀之美
    宁静是一种生产力
    POJ 2524 Ubiquitous Religions 【并查集】
    POJ 1611 The Suspects【并查集】
  • 原文地址:https://www.cnblogs.com/520-42/p/8803509.html
Copyright © 2011-2022 走看看