代码实现
# include <stdio.h>
# include <stdlib.h>
# include <stdbool.h>
# define InitSize 3
# define ElemType int typedef struct { ElemType * data; int MaxSize, length;
} SeqList;
bool Empty ( SeqList list) ;
void InitList ( SeqList * list) { list-> data = ( ElemType * ) malloc ( InitSize * sizeof ( ElemType) ) ; list-> MaxSize = InitSize; list-> length = 0 ;
}
bool MultipleList ( SeqList * list) {
if ( list-> data != NULL ) { list-> data = ( ElemType * ) realloc ( list-> data, list-> MaxSize * sizeof ( ElemType) * 2 ) ; list-> MaxSize = list-> MaxSize * 2 ; return true; } printf ( "扩容失败!\n" ) ; return false;
}
int Length ( SeqList list) { return list. length;
}
void AddElem ( SeqList * list, ElemType Elem) { if ( list-> length == list-> MaxSize) { if ( ! MultipleList ( list) ) { printf ( "扩容失败,线性表已被销毁!\n" ) ; return ; } } list-> data[ list-> length] = Elem; list-> length++ ;
}
int LocateElem ( SeqList list, ElemType Elem) { if ( Empty ( list) ) { return - 1 ; } for ( int i = 0 ; i < list. length; i++ ) { if ( list. data[ i] == Elem) return i; } return - 1 ;
}
bool GetElem ( SeqList list, int index, ElemType * Elem) { if ( index >= 0 && index < list. length) { * Elem = list. data[ index] ; return true; } printf ( "获取失败!\n" ) ; return false;
}
bool ListInsert ( SeqList * list, int index, ElemType Elem) { if ( list-> length == list-> MaxSize) { MultipleList ( list) ; } if ( index >= 0 && index < list-> length) { for ( int i = list-> length - 2 ; i >= index; i-- ) { list-> data[ i + 1 ] = list-> data[ i] ; } list-> data[ index] = Elem; list-> length++ ; return true; } return false;
}
bool ListDelete ( SeqList * list, int index) { if ( index >= 0 && index < list-> length) { for ( int i = index; i < list-> length - 1 ; i++ ) { list-> data[ i] = list-> data[ i+ 1 ] ; } list-> length-- ; return true; } return false;
}
void DestroyList ( SeqList * list) { if ( list-> data != NULL ) { free ( list-> data) ; list-> data = NULL ; } list-> length = 0 ; list-> MaxSize = 0 ;
}
void PrintList ( SeqList list) { if ( Empty ( list) ) { printf ( "线性表为空!\n" ) ; return ; } for ( int i = 0 ; i < list. length; i++ ) { printf ( "%d -> %d\n" , i, list. data[ i] ) ; }
}
bool Empty ( SeqList list) { if ( list. length == 0 ) return true; return false;
} int main ( ) { SeqList a; ElemType Elem; int index, choice; InitList ( & a) ; while ( 1 ) { printf ( "\n菜单\n" "1.查看线性表\n" "2.获取线性表长度\n" "3.添加线性表元素\n" "4.按值查找操作\n" "5.按位查找操作\n" "6.插入操作\n" "7.删除操作\n" "8.销毁线性表\n" "9.退出程序\n" "10.获取线性表最大长度(测试)\n" "请输入你要进行的操作:" ) ; scanf ( "%d" , & choice) ; switch ( choice) { case 1 : PrintList ( a) ; break ; case 2 : printf ( "当前线性表长度为%d\n" , Length ( a) ) ; break ; case 3 : printf ( "请输入要添加的数据数值:" ) ; scanf ( "%d" , & Elem) ; AddElem ( & a, Elem) ; break ; case 4 : printf ( "请输入要查找的数据元素值:" ) ; scanf ( "%d" , & Elem) ; index = LocateElem ( a, Elem) ; if ( index == - 1 ) { printf ( "元素查找失败!\n" ) ; break ; } else { printf ( "元素%d对应的数组下标为%d\n" , Elem, index) ; break ; } case 5 : printf ( "请输入要查找的数据元素的数组下标:" ) ; scanf ( "%d" , & index) ; if ( GetElem ( a, index, & Elem) ) { printf ( "数组下标为%d的元素为%d\n" , index, Elem) ; break ; } else { printf ( "查找失败!\n" ) ; break ; } case 6 : printf ( "请输入要插入的元素的位置(数组下标):" ) ; scanf ( "%d" , & index) ; printf ( "请输入要插入的元素的数据值:" ) ; scanf ( "%d" , & Elem) ; if ( ListInsert ( & a, index, Elem) ) { printf ( "插入成功!\n" ) ; break ; } else { printf ( "插入失败!输入的数组下标不合法\n" ) ; break ; } case 7 : printf ( "请输入要删除的元素的数组下标:" ) ; scanf ( "%d" , & index) ; if ( ListDelete ( & a, index) ) { printf ( "元素删除成功!\n" ) ; break ; } else { printf ( "元素删除失败!输入的下标不合法\n" ) ; break ; } case 8 : DestroyList ( & a) ; break ; case 9 : exit ( 0 ) ; case 10 : printf ( "当前线性表最大长度为%d\n" , a. MaxSize) ; break ; default : printf ( "输入的操作有误,请重新输入!\n" ) ; break ; } }
}