zoukankan      html  css  js  c++  java
  • 单链表

    #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)

  • 相关阅读:
    source vimrc的时候报错:.vimrc:1: command not found: syntax
    python Qt5 实战(一)按钮颜色
    python做中学(二)bool()函数的用法
    python做中学(一)全局变量的用法
    音频算法speex中的aec分析以及解析
    ubuntu 18.04 安装mysql 遇到语言格式不兼容性问题解决
    ubuntu18.04 中个性化配置vim方法
    蓝牙协议栈中关于回连和断开的定义
    autojump--懒人利器
    终端中的 zsh 和 bash-魔法切换
  • 原文地址:https://www.cnblogs.com/dzqdzq/p/3366585.html
Copyright © 2011-2022 走看看