线性表的顺序表示
线性表的顺序表示
注:本程序是按照清华大学出版社出版由严蔚敏所编的《数据结构(C 语言版)》写的,程序中的函数名,自定义名等等都是按照书上所写。除此之外,本程序在C-Free 3.5编译通过。 本人是软件专业的学生,如果诸位大神有什么高招或赐教,请给本人发邮箱(无事勿扰),谢谢!([email protected])
程序:
/*
*线性表的顺序表示
*花满楼
*2010-1-27
*/
#include
#include
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int Status;
typedef int ElemType;
typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;
void MenuShow();
Status InitList(SqList *L);
void ListDestroy(SqList *L);
int ListLength(SqList L);
Status GetElem(SqList L,int i,ElemType *e);
Status LocateElem(SqList L,ElemType e,int *i); // 创建 // 清空 // 线性表的长度 // 查找元素 // 查找元素的位置
Status ListInsert(SqList *L,int i,ElemType e); // 增
Status ListDelete(SqList *L,int i,ElemType *e); // 删
int main()
{
SqList L;
ElemType e;
int data;
int i;
InitList(&L);
MenuShow();
while(1)
{
printf("\n请选择功能(1-2-3-4-5): ");
scanf("%d",&data);
switch (data)
{
case 1 : {
printf("\n线性表的长度是:%d",ListLength(L)); break;
}
case 2 : {
printf("\n请输入您要插入的位置:");
scanf("%d",&i);
printf("\n请输入您要插入的值:");
scanf("%d",&e);
if(ListInsert(&L,i,e))
printf("\n插入成功!");
else
{
printf("\n插入失败!");
printf("\n插入的位置不对!");
}
break;
}
case 3 : {
printf("\n请输入您要删除的位置:");
scanf("%d",&i);
if(ListDelete(&L,i,&e))
{
printf("\n删除成功!");
printf("\n删除的是:%d.",e);
}
else
printf("\n删除失败!");
break;
}
case 4 : {
printf("\n请输入您要查找的位置:");
scanf("%d",&i);
if(GetElem(L,i,&e))
{
printf("\n查找成功!");
printf("\n线性表的第%d个元素是:%d.",i,e); }
else
printf("\n查找失败!");
break;
}
case 5 : {
printf("\n请输入您要查找的元素值:");
scanf("%d",&e);
if(LocateElem(L,e,&i))
{
printf("\n查找成功!");
printf("\n线性表元素值'%d'的位置为:%d.",e,i); }
else
printf("\n查找失败!");
break;
}
case 6 : {
ListDestroy(&L);
exit(1);
break;
}
default : printf("\n请输入正确的操作步骤!");
}
}
return 0;
}
void MenuShow()
{
printf("\n----------------*顺序线性表*------------------");
printf("\n 1. 线性表的长度");
printf("\n 2. 增加元素");
printf("\n 3. 删除元素");
printf("\n 4. 查找元素");
printf("\n 5. 查找位置");
printf("\n 6. 退出");
printf("\n----------------------------------------------");
}
Status InitList(SqList *L)
{
L->elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(!L->elem)
{
printf("内存不足!\n");
exit(OVERFLOW);
}
L->length = 0;
L->listsize = LIST_INIT_SIZE;
return OK;
}
void ListDestroy(SqList *L)
{
free(L->elem);
L->length = 0;
L->listsize = LIST_INIT_SIZE;
}
int ListLength(SqList L)
{
return L.length;
}
Status GetElem(SqList L,int i,ElemType *e)
{
if(iListLength(L))
return ERROR;
*e = L.elem[i-1];
return OK;
}
Status LocateElem(SqList L,ElemType e,int *i)
{
*i = 1;
while(*i
{
if(L.elem[*i-1]==e)
{
break;
}
(*i)++;
}
if(*i>ListLength(L))
{
*i = 0;
return ERROR;
}
else
return OK;
}
Status ListInsert(SqList *L,int i,ElemType e)
{
ElemType *newbase;
ElemType *p,*q;
if(iListLength(*L)+1)
return ERROR;
if(ListLength(*L)>=L->listsize)
{
newbase
(ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType)); if(!newbase)
{
printf("内存不足!");
exit(OVERFLOW);
}
L->elem = newbase;
L->listsize += LISTINCREMENT;
}
p=L->elem+i-1;
q=L->elem+L->length-1;
for(q;q>p;q--)
*(++q) = *q;
*p = e;
L->length += 1;
return OK; =
}
Status ListDelete(SqList *L,int i,ElemType *e) {
ElemType *p,*q;
if(iListLength(*L))
return ERROR;
p = L->elem+i-1;
q = L->elem+ListLength(*L)-1;
*e = *p;
for(p++;p
*(--p) = *p;
L->length -= 1;
return OK;
}
实验结果: