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

    /**
     * 单链表
     **/
    #include <stdlib.h>
    #include <iostream.h>
    
    #define OK 1
    #define ERROR 0
    
    //结点类型
    typedef struct node{
        int item;
        struct node *next;
    }NODE;
    
    //链表类型
    typedef struct{
        NODE *head;
    }LINK_LIST;
    
    //初始化单链表
    int init(LINK_LIST *L)
    {
        L->head=(NODE*)malloc(sizeof(NODE));
        //为头结点分配存储单元
        if (L->head)
        {
            L->head->next=NULL;
            return OK;
        }
        else
            return ERROR;
    }
    
    //销毁链表L 
    void destory(LINK_LIST *L)
    {
        NODE *p;
        while (L->head){             //依次删除链表中的所有结点
            p=L->head;  
            L->head=L->head->next;
            free(p);
        }
    }
    
    //清空单链表
    void clear(LINK_LIST *L)
    {
        NODE *p;
        while (L->head->next){
            p=L->head->next;            //p指向链表中头结点后面的第一个结点
            L->head->next=p->next;        //删除p结点
            free(p);                    //释放p结点占据的存储空间
       }
    }
    
    //链表长度
    int length(LINK_LIST L)
    {
        NODE *p = L.head;
        int len;
        for(p=L.head,len=0; p->next!=NULL; p=p->next,len++);
        return(len);
    }
    
    //判断是否为空
    int isEmpty(LINK_LIST L) 
    {
         if(L.head->next==NULL) 
             return 1;
         else 
             return 0;
    }
    
    //通过e返回链表L中第i个数据元素的内容
    void getElem(LINK_LIST L,int i,int *e)  
    {
        NODE *p;
        int j;
        if (i<1||i>length(L)) exit(0);
        //检测i值的合理性
        for (p=L.head,j=0; j!=i; p=p->next,j++);
        //找到第i个结点
        *e=p->item;          
        //将第i个结点的内容赋给e指针所指向的存储单元中
    }
    
    //在链表L中检索值为e的数据元素
    NODE *locateELem(LINK_LIST L,int e)
    {
        NODE *p;
        for(p=L.head->next;p&&p->item!=e;p=p->next); 
        //寻找满足条件的结点
        return(p);
    }
    
    //返回链表L中结点e的直接前驱结点
    NODE *PriorElem(LINK_LIST L,NODE *e)
    {
        NODE *p;
        if (L.head->next==e) return NULL;        
        //检测第一个结点
        for (p=L.head;p->next&&p->next!=e;p=p->next);     
        if (p->next==e) return p;
        else return NULL;
    }
    
    //返回链表L中结点e的直接后继结点
    NODE *NextElem(LINK_LIST L,NODE *e)
    {
        NODE *p;
        for(p=L.head->next;p&&p!=e;p=p->next);
        if (p) p=p->next;  
        return p;
    }
    
    //在链表L中第i个数据元素之前插入数据元素e   
    int insertList(LINK_LIST *L,int i,int e)       
    {
        NODE *p,*s;
        int j;
        if (i<1||i>length(*L)+1) return ERROR;
        s=(NODE*)malloc(sizeof(NODE));
        if (s==NULL) return ERROR;
        s->item=e;
        for (p=L->head,j=0;p&&j<i-1;p=p->next,j++); 
        //寻找第i-1个结点
        s->next=p->next;  p->next=s;      //将s结点插入
        return OK;
    }
    
    //将链表L中第i个数据元素删除,并将其内容保存在e中。
    int deleteList(LINK_LIST *L,int i,int *e)
    {
        NODE *p,*s;
        int j;
        if (i<1||i>length(*L)) return ERROR;    
        //检查i值的合理性
        for(p=L->head,j=0;j<i-1;p=p->next,j++);   
        //寻找第i-1个结点
        s=p->next;           //用s指向将要删除的结点
        *e=s->item;          
        p->next=s->next;      //删除s指针所指向的结点
        free(s);
        return OK;
    }
    
    //插入链表
    void insert(LINK_LIST *L)
    {
        cout<<"请依次递增输入这5个数据:"<<endl;
        NODE *head = L->head;
        for(int i=0;i<5;i++)
        {
            NODE* node = (NODE*)malloc(sizeof(NODE));
            cin>>node->item;
            node->next = NULL;
            head->next = node;
            head = node;
        }
    }
    
    //输出单链表
    void print(LINK_LIST L)
    {
        NODE* head = L.head->next;
        while(head != NULL)
        {
            cout<<head->item<<"  ";
            head = head->next;
        }
        cout<<endl;
    }
  • 相关阅读:
    字符串 CSV解析 表格 逗号分隔值 通讯录 电话簿 MD
    Context Application 使用总结 MD
    RxJava RxPermissions 动态权限 简介 原理 案例 MD
    Luban 鲁班 图片压缩 MD
    FileProvider N 7.0 升级 安装APK 选择文件 拍照 临时权限 MD
    组件化 得到 DDComponent JIMU 模块 插件 MD
    gradlew 命令行 build 调试 构建错误 Manifest merger failed MD
    protobuf Protocol Buffers 简介 案例 MD
    ORM数据库框架 SQLite 常用数据库框架比较 MD
    [工具配置]requirejs 多页面,多入口js文件打包总结
  • 原文地址:https://www.cnblogs.com/hnhcc39/p/2923622.html
Copyright © 2011-2022 走看看