今日一言:
"每位师父都会各有长短,很正常。"
"那叶师父,你呢?"
"我每样都懂一点点。"
——《叶问》
数据结构(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){
if( list->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
if( list->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 *list, int 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 *list, int 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 *list, int index){
return getElem(list,index)->value;
}
// 移除元素
void removeIndexL(LinkList *list, int index){
struct Elem *elem = getElem(list, index);
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;
if( list->first == elem ){
list->first = elem->next;
}
list->size--;
}