• 数据结构-线性表之单链表


    其实如果c语言学的够好,这些东西也不是很难,很多人学习链表觉得难,是指针学的不够好。


    //单链表(线性表的链式存储)的实现

    #include <stdio.h>
    #include <stdlib.h>

    //定义数据类型
    typedef int datatype_t;

    //定义单链表结构体
    typedef struct node{
        datatype_t data; //数据域
        struct node *next; //指针域(指向结构体的)
    }linklist_t;

    //创建一个空的单链表
    linklist_t *linklist_create()
    {
        linklist_t *ll;
        ll = (linklist_t *)malloc(sizeof(linklist_t));

        ll->next = NULL;

        return ll;
    }

    //插入数据(头插法)
    int linklist_insert_head(linklist_t *ll, datatype_t value)
    {
        linklist_t *temp;
        temp = (linklist_t *)malloc(sizeof(linklist_t));

        temp->data = value;

        temp->next = ll->next;
        ll->next = temp;

        return 0;
    }

    //打印数据
    int linklist_show(linklist_t *ll)
    {
        while(ll->next != NULL)
        {
            ll = ll->next;
            printf("%d ", ll->data);
        //    printf("%d ", ll->next->data);
        //    ll = ll->next;
        }

        putchar(10);

        return 0;
    }

    //插入数据(尾插法)
    int linklist_insert_tail(linklist_t *ll, datatype_t value)
    {
        linklist_t *temp;
        temp = (linklist_t *)malloc(sizeof(linklist_t));

        temp->data = value;

        while(ll->next != NULL)
        {
            ll = ll->next;
        }

        ll->next = temp;
        temp->next = NULL;

        return 0;
    }

    //删除数据(头删法)
    datatype_t linklist_delete_head(linklist_t *ll)
    {
        linklist_t *temp;
        datatype_t value;

        temp = ll->next;
        value = temp->data;

        ll->next = temp->next;

        free(temp);
        temp = NULL;

        return value;
    }

    //更改数据
    int linklist_change(linklist_t *ll, datatype_t old_value, datatype_t new_value)
    {
        while(ll->next != NULL)
        {
            if(ll->next->data == old_value)
            {
                ll->next->data = new_value;
                return 0;
            }
            else
            {
                ll = ll->next;
            }
        }

        printf("value is not exist ");
        return -1;
    }

    //按照数据查找位置
    int linklist_search_value(linklist_t *ll, datatype_t value)
    {
        int pos = 1;

        while(ll->next != NULL)
        {
            if(ll->next->data == value)
            {
                return pos;
            }
            else
            {
                ll = ll->next;
                pos++;
            }
        }

        printf("the value is not exist ");
        return -1;
    }

    //按照位置插入数据
    int linklist_insert_pos(linklist_t *ll, int pos, datatype_t value)
    {
        int i = 0;
        linklist_t *temp;
        temp = (linklist_t *)malloc(sizeof(linklist_t));

        temp->data = value;

        while(i < pos && ll->next != NULL)
        {
            ll = ll->next;
            i++;
        }

        temp->next = ll->next;
        ll->next = temp;

        return 0;
    }

    //按照顺序插入数据(自带排序功能)
    int linklist_insert_sort(linklist_t *ll, datatype_t value)
    {
        linklist_t *temp = (linklist_t *)malloc(sizeof(linklist_t))    ;
        temp->data = value;

        while(ll->next != NULL && ll->next->data < temp->data)
        {
            ll = ll->next;
        }

        temp->next = ll->next;
        ll->next = temp;

        return 0;
    }

    //实现链表的翻转
    //10 20 30 40 50
    //50 40 30 20 10
    int linklist_recover(linklist_t *ll)
    {
        linklist_t *p = ll->next;  //p指向我们的有数据的链表
        linklist_t *q = NULL; //q专门负责获取结点并插入到链表后面

        ll->next = NULL;

        while(p != NULL)
        {
            q = p;
            p = p->next;

            q->next = ll->next;
            ll->next = q;
        }

        return 0;
    }

    int main(int argc, const char *argv[])
    {
        linklist_t *ll = linklist_create();

        linklist_insert_head(ll, 10);
        linklist_insert_head(ll, 20);
        linklist_insert_head(ll, 30);
        linklist_insert_head(ll, 40);
        linklist_insert_head(ll, 50);
        linklist_insert_head(ll, 60);
        linklist_show(ll);

        linklist_insert_tail(ll, 20);
        linklist_insert_tail(ll, 30);
        linklist_insert_tail(ll, 40);
        linklist_insert_tail(ll, 50);
        linklist_insert_tail(ll, 60);
        linklist_show(ll);

        printf("del = %d ", linklist_delete_head(ll));
        linklist_show(ll);

        linklist_change(ll, 60, 70);
        linklist_show(ll);

        printf("value = 50, pos = %d ", linklist_search_value(ll, 50));
        printf("value = 20, pos = %d ", linklist_search_value(ll, 20));

        linklist_insert_pos(ll, 3, 80);
        linklist_show(ll);

        printf("****************************** ");

        linklist_t *ll1 = linklist_create();

        linklist_insert_sort(ll1, 10);
        linklist_insert_sort(ll1, 30);
        linklist_insert_sort(ll1, 20);
        linklist_insert_sort(ll1, 50);
        linklist_insert_sort(ll1, 40);
        linklist_show(ll1);

        linklist_recover(ll1);
        linklist_show(ll1);
       
        return 0;
    }

  • 相关阅读:
    模板为webpack的目录结构
    实例和内置组件
    微信小程序之富文本解析
    微信小程序获取输入框(input)内容
    for循环的语法和执行顺序
    循环
    选择结构(二)
    选择结构
    算术运算
    变量
  • 原文地址:https://www.cnblogs.com/zhangfeionline/p/5941009.html
Copyright © 2020-2023  润新知