zoukankan      html  css  js  c++  java
  • 数据结构(2) —— 线性表

    今日一言:
    "每位师父都会各有长短,很正常。"
    "那叶师父,你呢?"
    "我每样都懂一点点。"
        ——《叶问》

    数据结构(2) —— 线性表

    线性结构的特点: 在数据元素的非空有限集中。

    • 存在唯一第一个
    • 存在唯一最后一个
    • 除第一个,每个元素只有一个前驱
    • 除最后一个,每个元素只有一个后继

    线性表: n个数据元素的有限序列。

    当数据元素由若干个数据项(item)组成时,称记录,含有大量记录的线性表称文件

    C语言实现线性表

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

    #define NullElem 0

    typedef int Elem;

    // 定义结构类型 
    typedef struct{
        Elem *data;
        int size;
        int MAXSIZE;
    } ArrayList;

    int isEqualElem( Elem e1, Elem e2 ){
        if( e1 == e2 ){
            return 1;
        }
        return 0;
    }

    // 构造空的线性表 
    void InitArrayList(ArrayList *list , int size){
        // 申请存储分配 
        list->data = (Elem *)malloc(sizeof(Elem)*size);
        // 申请失败退出 
        if( !list->data ) exit(1);
        // 保存最大长度 
        list->MAXSIZE = size;
        // 空线性表长为0 
        list->size = 0;
    }

    // 添加项操作 
    int addElem(ArrayList *list , Elem elem){
        iflist->size >= list->MAXSIZE ) return 1;
        list->data[list->size] = elem;
        list->size++;
        return 0;


    // 插入项操作 
    int insertElem(ArrayList *list , Elem elem , int index ){
        // 非法索引则返回1 
        if( index > list->MAXSIZE || index < 0 ) return 1;
        // 线性表满了就返回1 
        iflist->size >= list->MAXSIZE ) return 1;
        // 长度大于现表长则在尾部添加 
        if( index >= list->size ) return addElem(list,elem);
        int i;
        for( i = list->size ; i>=index ; i-- ){
            *(list->data+i) = *list->data;
        }
        *(list->data+index) = elem;
        list->size++;
        return 0
    }

    // 删除目标索引的项操作 
    int removeIndex(ArrayList *listint index){
        if ( index < 0 || index > list->size ) return 1;
        int i;
        for ( i = index + 1 ; i < list->size ; i++ ){
            *(list->data+(i-1)) = *(list->data+i);
        }
        *(list->data+(list->size-1)) = NullElem; // 最后一项置零
        list->size--;
        return 0;
    }

    // 删除项操作
    void removeElem(ArrayList *list, Elem elem , int removeAll){
        int i = 0;
        for ( ; i < list->size ; i++ ){
            if ( isEqualElem(elem , *(list->data+i))){
                removeIndex(list,i);
                if ( !removeAll ) break;
            }
        }
    }

    C语言实现线性链表

    实现的是双向链表,很久之前写的了,注释不多,但也好理解。

    #include "stdio.h"
    #include "stdlib.h"

    // 定义操作的元素类型
    struct Elem{
        struct Elem *prev;
        int value;
        struct Elem *next;
    } ; 
    // 定义链表结构
    typedef struct {
        struct Elem *first;
        struct Elem *last;
        int size;
    } LinkList; 

    // 初始化链表
    void initLinkList( LinkList *list ){
        list->size = 0;


    // 获取表长 
    int getSizeL(LinkList *list){
        return list->size;  
    }

    // 添加元素 
    void addLast(LinkList *list,struct Elem *elem){
        if( !getSizeL(list) ){
            list->first = elem;
            list->last = elem;
        } else {
            elem->prev = list->last;
            elem->next = list->first;
            list->last->next = elem;
            list->first->prev = elem;
            list->last = elem;
        }
        list->size++;
    }

    struct Elem * getElem(LinkList *listint index){
        int i ;
        struct Elem *elem;
        // 逐项访问 
        if ( index > list->size/2 ){
            elem = list->last;
            for ( i = list->size-1 ; i >= index ; i-- ){
                if( i == index ){
                    return elem;
                }
                elem = elem->prev;
            }
        } else {
            elem = list->first;
            for ( i = 0 ; i <= index ; i++ ){
                if( i == index ){
                    return elem;
                }
                elem = elem->next;
            }
        }
    }

    int getValue(LinkList *listint index){
        return getElem(list,index)->value;
    }

    // 移除元素 
    void removeIndexL(LinkList *listint index){
        struct Elem *elem = getElem(listindex);
        elem->prev->next = elem->next;
        elem->next->prev = elem->prev;
        if( index == 0 ){
            list->first = elem->next;
        }
        list->size--;
    }

    void removeElemL(LinkList *list, struct Elem *e){
        int i;
        struct Elem *elem = list->first;
        while(e != elem ){
            elem = elem->next;
        }
        elem->prev->next = elem->next;
        elem->next->prev = elem->prev;
        iflist->first == elem ){
            list->first = elem->next;
        }
        list->size--;
    }
  • 相关阅读:
    css实现左栏固定右栏自适应,高度自适应的布局
    使用canvas检测HTML5视频解码错误
    与webview打交道中踩过的那些坑
    走进AngularJs(五)自定义指令----(下)
    走进AngularJs(四)自定义指令----(中)
    走进AngularJs(三)自定义指令-----(上)
    为jQuery的$.ajax设置超时时间
    走进AngularJs(二) ng模板中常用指令的使用方式
    走进AngularJs(一)angular基本概念的认识与实战
    Javascript事件模型系列(四)我所理解的javascript自定义事件
  • 原文地址:https://www.cnblogs.com/rcklos/p/12897115.html
Copyright © 2011-2022 走看看