线序表的基本操作 实验内容: 1.编写线性表基本操作函数: (1)InitList(LIST L,int ms),初始化线性表; (2) InsertList(LIST L,int item,int rc):向线性表指定位置插入元素; (3)DeleteList1(LISTL,intitem):删
线序表的基本操作
实验内容:
1.编写线性表基本操作函数:
(1)InitList(LIST L,int ms),初始化线性表;
(2) InsertList(LIST L,int item,int rc):向线性表指定位置插入元素;
(3)DeleteList1(LISTL,intitem):删除指定元素值的线性表记录;
(4)DeleteList2(LISTL,intrc):删除指定位置的线性表记录;
(5)FindList(LIST *L,int item):查找线性表中的元素;
(6)OutputList(LIST *L):输出线性表元素;
2.调用上述函数实现下列操作,操作步骤如下:
(1)初始化线性表;
(2)调用插入函数建立一个线性表;
(3)在线性表中寻找指定的元素;
(4)在线性表中删除指定值的元素;
(5)在线性表中删除指定位置的元素;
(6)遍历并输出线性表。
注:每完成一个步骤,必须及时输出线性表元素,便于观察结果。
源代码:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
struct LinearList /*定义线性表结构*/
{
int *list; /* 存线性表元素 */
int size; /* 存线性表长度 */
int MaxSize; /* 存list数组元素个数 */
};
typedef struct LinearList LIST;
void InitList( LIST *L, int ms ) /* 初始化线性表 */
{
if( (L->list = (int *) malloc( ms * sizeof(int) ) ) == NULL ) {
printf( "内存申请错误!\n" );
exit( 1 );
}
L->size = 0;
L->MaxSize = ms;
}
int InsertList( LIST *L, int item, int rc )
/* item:记录值 rc:插入位置 */
{
int i;
if( L->size >= L->MaxSize ) /* 线性表已满 */
return -1;
if( rc < 0 ) /* 插入位置为 0 */
rc = 0;
if( rc > L->size )
rc = L->size;
for( i = L->size - 1; i >= rc; i-- ) /* 将线性表元素后移 */
L->list[i+1] = L->list[i];
L->list[rc] = item;
L->size ++;
return 0;
}
void OutputList( LIST *L ) /* 输出线性表元素 */
{
int i;
for( i = 0; i < L->size; i++ )
printf( "%d ", L->list[i] );
printf( "\n" );
}
int FindList( LIST *L, int item ) /* 返回 >=0 为元素位置 ?1 没找到 */
{
int i;
for( i = 0; i < L->size; i++ )
if( item == L->list[i] ) /* 找到相同的元素,返回位置 */
return i;
return -1; /* 没找到 */
}
int DeleteList1( LIST *L, int item )
/* 删除指定元素值的线性表记录,返回>=0:删除成功 */
{
int i, n;
for( i = 0; i < L->size; i++ )
if( item == L->list[i] ) /* 找到相同的元素 */
break;
if( i < L->size ) {
for( n = i; n < L->size - 1; n++ )
L->list[n] = L->list[n+1];
L->size --;
return i;
}
return -1;
}
int DeleteList2( LIST *L, int rc ) /* 删除指定位置的线性表记录,返回0:删除成功 */
{
int i, n;
if( rc < 0 || rc >= L->size )/* 记录位置不在线性表范围内,返回错误 */
return -1;
for( n = rc; n < L->size - 1; n++ )
L->list[n] = L->list[n+1];
L->size --;
return 0;
}
void main()
{
LIST LL;
int i, r;
printf( "list addr=%p\tsize=%d\tMaxSize=%d\n", LL.list, LL.size, LL.MaxSize );
InitList( &LL, 100 );
printf( "list addr=%p\tsize=%d\tMaxSize=%d\n", LL.list, LL.size, LL.MaxSize );
while( 1 )
{
printf( "请输入元素值,输入0结束插入操作:" );
fflush( stdin ); /* 清空标准输入缓冲区 */
scanf( "%d", &i );
if( i == 0 )
break;
printf( "请输入插入位置:" );
scanf( "%d", &r );
InsertList( &LL, i, r-1 );
printf( "线性表为: " );
OutputList( &LL );
}
while( 1 )
{
printf( "请输入查找元素值,输入0结束查找操作:" );
fflush( stdin ); /* 清空标准输入缓冲区 */
scanf( "%d", &i );
if( i == 0 )
break;
r = r = FindList( &LL, i );
if( r < 0 )
printf( "没找到\n" );
else
printf( "有符合条件的元素,位置为:%d\n", r+1 );
}
while( 1 )
{
printf( "请输入删除元素值,输入0结束查找操作:" );
fflush( stdin ); /* 清空标准输入缓冲区 */
scanf( "%d", &i );
if( i == 0 )
break;
r = r = DeleteList1( &LL, i );
if( r < 0 )
printf( "没找到\n" );
else {
printf( "有符合条件的元素,位置为:%d\n线性表为:", r+1 );
OutputList( &LL );
}
}
while( 1 )
{
printf( "请输入删除元素位置,输入0结束查找操作:" );
fflush( stdin ); /* 清空标准输入缓冲区 */
scanf( "%d", &r );
if( r == 0 )
break;
i = i = DeleteList2( &LL, r-1 );
if( i < 0 )
printf( "位置越界\n" );
else {
printf( "线性表为:" );
OutputList( &LL );
}
}
}
运行结果:
题型来源:清华大学出版社 数据结构第五版(C语言版) 邓文华主编