• 单链表


    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    #include<assert.h>
    typedef struct node
    {
        int data;
        struct node *next;
    }NODE,HEAD,*PNODE,*LINKLIST;
    
    //初始化链表
    void init(LINKLIST *list)
    {
        *list = (LINKLIST)malloc(sizeof(HEAD));
        (*list)->next=NULL;
    }
    
    //向链表添加数据
    void add(LINKLIST list,int data)
    {
        PNODE p = list ,q;
        if(!p)
            return;
        //将p指向list的最后一个
        while(p->next)
            p=p->next;
        q = (PNODE)malloc(sizeof(NODE));
        q->data = data;
        q->next = NULL;
        p->next = q;
    }
    
    //第i个位置 插入数据    i>=1
    void insert(LINKLIST list,int i,int data)
    {
        int j;
        PNODE p=list,q;
        //将 p 指向 list的第 i-1 个位置
        for(j=1;j<i && p;j++)
        {
            p = p->next;
        }
        if(!p || i<1)
            return ;
        q = (PNODE) malloc(sizeof(NODE));
        q->data =data;
        q->next = p->next;
        p->next = q;
    }
    
    //删除第i个位置的数据  i>=1,并将删除的数据保存在data中
    void del(LINKLIST list,int i,int *data)
    {
        int j;
        PNODE p=list,q;
        //将 p 指向 list的第 i-1 个位置
        for(j=1;j<i && p;j++)
        {
            p = p->next;
        }
        if(!p || i<1)
            return ;
        q = p->next;//q为要删除的节点
        *data = q->data;
        p->next = q->next;
        free(q);
    }
    
    //清除list
    void clear(LINKLIST list)
    {
        PNODE p=list,q=p->next;
        if(!p)
            return;
        while(p=q)
        {
            q=p->next;
            free(p);
        }
        list->next=NULL;
    }
    
    //销毁list
    void destroy(LINKLIST list)
    {
        PNODE p=list,q;
        while(p)
        {
            q = p->next;
            free(p);
            p = q;
        }
    }
    
    //获取list中的第i个元素 i>=1
    int getData(LINKLIST list,int i)
    {
        PNODE p=list;
        assert(i>=1 && p);//为p断言,防止list不存在或者i的位置不合法
        while(i-- && p)
            p=p->next;
        assert(p);//为p和i断言,防止位置i不在list的范围内
        return p->data;
    }
    
    //获取链表的长度
    int getLen(LINKLIST list)
    {
        PNODE p=list;
        int i=0;
        if(!p)
            return i;
        while(p->next)
        {
            i++;
            p=p->next;
        }
        return i;
    }
    
    //显示
    void display(LINKLIST list)
    {
        PNODE p=list;
        if(!p)
            return ;
        while(p= p->next)
            printf("%d ",p->data);
        printf("
    ");
    }
    
    int main()
    {
        int i;
        LINKLIST list;
        init(&list);
        for(i=1;i<=10;i++)
            add(list,i);
    
        display(list);
        printf("%d
    ",getData(list,1));
        destroy(list);//销毁
        system("pause");
        return 0;
    }

    总结:

    插入操作:

    1,将指针P指向插入位置前一个。

    2,insertNode->next = P->next。

    3,P->next = insertNode

    删除操作:

    1,将指针P指向删除节点delNode的前一个

    2,delNode = p->next

    3,p->next = delNode->next

    4,free(delNode)

  • 相关阅读:
    jquery 回车切换 tab功能
    Jtemplates 基本语法
    Rdlc报表出现空白页解决方法
    动软代码生成与 EntityFramework 实体生成模板
    windows 无法启动asp.net 状态服务 错误 0x8007277a
    导出Excel Gridview
    错误提示:类型“GridView”的控件“GridView1”必须放在具有 runat=server 的窗体标记内 .
    c#与vb.net在App_Code里面编译要通过,需要以下web.config的配置
    個人最近做的最多的重複工作就是excel导出
    Js/Jquery获取iframe中的元素 在Iframe中获取父窗体的元素方法
  • 原文地址:https://www.cnblogs.com/dzqdzq/p/3366585.html
Copyright © 2020-2023  润新知