• LinkList(链表)


      code:

    #include <stdio.h>
    #include <time.h>
    #include <conio.h>
    #include <stdlib.h>
    
    #define INITIA 10
    
    typedef int ElemType;
    
    typedef int Status;
    
    typedef struct Node
    {
        ElemType data;
        struct Node * next;
    }node;
    
    node * head = NULL, *p, *q;
    
    Status GetElem();
    Status LinkListInsert();
    Status LinkListDelete();
    
    //获取某个地址的元素
    Status GetElem(int i, ElemType e)
    {
        int j;
        p = head;
        j = 1;
        while(p && j < i - 1)
        {
            p = p -> next;
            ++j;
        }
        if(!p || j > i)
            return 0;
        e = p -> data;
        printf("%d
    ",p -> data);
        return 1;
    }
    //向链表某位置插入节点
    Status LinkListInsert(int i)
    {
        int j;
        node * s;
        p = head;
        j = 1;
        while(p && j < i - 1)
        {
            p = p ->next;
            ++j;
        }
        if(!p || j > i)
            return 0;
        s = ( node * ) malloc ( sizeof ( node ) );
        s -> data = rand()%100 + 1;
        s ->next = p -> next, p -> next = s ;
        return 1;
    }
    //删除链表某节点
    Status LinkListDelete(int i, ElemType e)
    {
        int j;
        node * s;
        p = head;
        j = 1;
        while(p && j < i - 1)
        {
            p = p -> next;
            ++j;
        }
        if(!p || j > i)
            return 0;
        s = p -> next;
        p -> next = p -> next -> next;
        e = s -> data;
        free(s);
        s = NULL;
    
        return 1;
    }
    
    int main()
    {
        char str;
        int i;
        ElemType e = 0;
        srand ( time( 0 ) );
        for(i = 0; i < INITIA; i ++)
        {
            p = ( node * ) malloc ( sizeof ( node ) );
            if(head == NULL)
                head = p;
            else
                q ->next = p;
            p -> next = NULL;
            p -> data = rand()%100 + 1;
            q = p;
        }
        p = head;
        while(p)
        {
            printf("%d ",p -> data);
            p = p -> next;
        }
        printf("
    查找 请按 1   插入数据 请按 2   删除数据 请按 3");
        str = getch();
        if(str == '1')
        {
            printf("
    请输入要查找的数的位置:");
            scanf("%d
    ",&i);
            GetElem(i, e);
        }
        if(str == '2')
        {
            printf("
    请输入要插入的数的位置:");    //插在原本该位置上数据的前面
            scanf("%d",&i);
            LinkListInsert(i);
            p = head;
            while(p)
            {
                printf("%d ",p -> data);
                p = p -> next;
            }
        }
        if(str == '3')
        {
            printf("
    请输入要删除的数的位置:");
            scanf("%d",&i);
            LinkListDelete(i, e);
            p = head;
            while(p)
            {
                printf("%d ",p -> data);
                p = p -> next;
            }
        }
        while(head)
        {
            p = head;
            head = head -> next;
            free(p);
        }
        p = NULL;
    
        return 0;
    }

    # 2017.8.8

      前面的测试并不完整,它有一个BUG,比如插入第一位和删除第一位时都不对。

      解决:

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #include<string.h>
    #include<conio.h>
    
    #define N 5
    
    typedef char Element;
    typedef int Status;
    
    
    typedef struct Node
    {
        Element data [20];
        struct Node*next;
    }Node;
    
    Node*head,*tail,*current;
    
    void Swap();
    void Sort();
    int length();
    Status GetData();
    Status InsertNode();
    Status DeleteNode();
    
    void Swap(Element*p, Element*q)
    {
        Element swap[20];
        strcpy(swap, p),strcpy(p, q),strcpy(q, swap);
    }
    
    void Sort(Node*p)
    {
        Node*q;
        for(p = head->next; p != NULL; p = p->next)
            for(q = p->next; q != NULL; q = q->next)
                if(*(p->data) > *(q->data))
                    Swap(p->data, q->data);
    }
    
    int length(Node*p)                //链表长度
    {
        int i = 1;
        p = head->next;
        while(p)
        {
            p = p ->next;
            i++;
        }
        return i;
    }
    
    Status GetData(Node*p, int i)    //获取某节点数据
    {
        int j = 0;
        Element Elem [20];
    
        p = head->next;
    
        if(i < 1 || i > length(p))
            return 0;
    
        while(p && j < i - 1)
        {
            p = p->next;
            j++;
        }
    
        if(!p || j > i)
            return 0;
        printf("%s
    ",strcpy(Elem, p->data));
        return 1;
    }
    
    Status InsertNode(Node*p, int i, Element Elem [])
    {
        Node*New;
        int j = 1;
    
        p = head->next;
    
        if(i == 1)
        {
            New = (Node *)malloc(sizeof(Node));
            strcpy(New->data, Elem);
            New->next = head->next;
            head->next = New;
        }
    
        if(i < 1 || i > length(p))
            return 0;
    
        if(i > 1)
        {
            while(p && j < i - 1)
            {
                p = p->next;
                j++;
            }
    
            if(!p || j > i)
                return 0;
    
            New = (Node *)malloc(sizeof(Node));
            strcpy(New->data, Elem);
            New->next = p->next;
            p->next = New;
        }
        return 1;
    }
    
    Status DeleteNode(Node*p, int i)
    {
        int j = 1;
        Node*h;
    
        p = head->next;
    
        if(i == 1)
        {
            h = head->next;
            head->next = p->next;
            free(h);
        }
    
        if(i < 1 || i > length(p))
            return 0;
    
        if(i > 1)
        {
            while(p && j < i - 1)
            {
                p = p->next;
                j++;
            }
    
            if(!p || j > i)
                return 0;
    
            h = p->next;
            p->next = p->next ->next;
            free(h);
        }
        return 1;
    }
    
    int main()
    {
        int i, Pos;
        char key;
        Element Elem[20];
        Node*p;
    
        head = (Node *)malloc(sizeof(Node));
        tail = head;
        for(i = 0; i < N; i++)
        {
            current = (Node *)malloc(sizeof(Node));
            gets(current->data);
            tail-> next = current;
            tail = current;
        }
        tail->next = NULL;
    
        puts("显示数据:");
        p = head->next;
        while(p)
        {
            printf("%s ",p->data);
            p = p->next;
        }
        putchar('
    ');
    
        puts("按 1 由大到小排序    按 2 插入数据");
        puts("按 3 删除数据        按 4 查看某位置的数据");
        puts("按 q 退出程序");
        while((key = getch()) != 'q')
        {
            if(key == '1')
            {
                p = head->next;
                Sort(p);
    
                p = head->next;
                while(p)
                {
                    printf("%s ", p->data);
                    p = p->next;
                }
                putchar('
    ');
            }
            if(key == '2')
            {
                p = head->next;
                puts("
    ");
                printf("请输入要插入的位置/数据:");
                scanf("%d %s",&Pos, Elem);
    
                InsertNode(p, Pos, Elem);
    
                puts("插入完毕!
    显示数据:");
                p = head->next;
                while(p)
                {
                    printf("%s ", p->data);
                    p = p->next;
                }
            }
            if(key == '3')
            {
                p = head->next;
                puts("
    ");
                printf("请输入要删除的数据的位置:");
                scanf("%d",&Pos);
                DeleteNode(p, Pos);
    
                puts("删除完毕!
    显示数据:");
                p = head->next;
                while(p)
                {
                    printf("%s ",p->data);
                    p = p->next;
                }
            }
            if(key == '4')
            {
                p = head->next;
                printf("请输入要查看的数据的位置:");
                scanf("%d", &Pos);
    
                puts("查看数据:");
                GetData(p, Pos);
            }
        }
    
        return 0;
    }
    

      

  • 相关阅读:
    SharePoint REST API
    线程同步
    win32
    win32
    win32
    win32
    win32
    win32
    win32
    解决CentOS被wbew挖矿程序入侵的方法
  • 原文地址:https://www.cnblogs.com/darkchii/p/7278939.html
Copyright © 2020-2023  润新知