数据结构(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--;
}
posted @ 2020-05-15 20:51  RCKLOS  阅读(186)  评论(0编辑  收藏  举报