求严蔚敏《数据结构》中包含初始化,插入,删除的完整调试程序?
求严蔚敏《数据结构》中包含初始化,插入,删除的完整调试程序?
2014-09-17 23:02
2014-09-19 17:21
程序代码:#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define Status int
#define ElemType int
#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 struct{
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList_sq(SqList &L)
{
//初始化一个顺序表
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem) //存储分配失败
exit(OVERFLOW);
L.length=0; //初始长度0
L.listsize=LIST_INIT_SIZE; //初始容量
return OK;
}//InitList_sq
void DestroyList_sq(SqList &L)
{
//销毁顺序表
free(L.elem);
L.elem=NULL;
L.length=0;
L.listsize=0;
}//DestroyList_sq
Status ListInsert_sq(SqList &L,int i,ElemType e)
{
//插入记录到顺序表
if(i<1 || i>L.length+1)
{
printf("输入不合法!!\n");
return ERROR; //i的值不合法
}
if(L.length>=L.listsize)
{
ElemType *newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) //分配失败
exit(OVERFLOW);
L.elem=newbase; //新基址
L.listsize+=LISTINCREMENT; //增加存储容量
}
ElemType *q = &(L.elem[i-1]); //q为插入位置
for(ElemType *p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1) = *p; //插入位置及之后的元素右移
*q = e; //插入e
++L.length;
return OK;
}//ListInsert_sq
void Add(SqList &L)
{
//添加到列表尾
char c;
ElemType e;
do
{ printf("\n请输入一条数据(整数):");
scanf("%d",&e);
ListInsert_sq(L,L.length+1,e); //尾添加
printf("\n是否继续输入(按y继续)?");
c=getche();
putchar('\n');
}while(c=='y');
}//Add
void Insert(SqList &L)
{
//插入到指定位置
char c;
ElemType e;
int i;
do
{ printf("\n请输入一条数据(整数):");
scanf("%d",&e);
do
{
i=L.length;
printf("请输入插入位置1 ~ %d:",i+1);
scanf("%d",&i);
}while(ListInsert_sq(L,i,e)==0); //插入位置不正确
printf("\n是否继续输入(按y继续)?");
c=getche();
putchar('\n');
}while(c=='y');
}//Insert
void OutputList_sq(SqList &L)
{
//输出所有记录
int l=L.length;
if(l!=0)
{
printf("所有记录如下:\n");
for(int i=0;i<L.length;i++)
printf("%d\n",L.elem[i]);
}
else
printf("表为空!\n\n");
}//OutputList_sq
Status ListEmpty_Sq(SqList &L)
{
//判断顺序表是否为空
if(L.length == 0)
return TRUE;
else
return FALSE;
}//ListEmpty_Sq
int ListLength_Sq(SqList &L)
{
//求长度
return L.length;
}//ListLength_Sq
Status ListDelete_Sq(SqList &L,int i,ElemType &e){
//在线性顺序表中删除第i个元素,并用e返回其值
//i的合法值为1<=i=<ListLength_Sq(L)
if ((i<1) || (i>L.length))
{
printf("输入不合法!!!");
return ERROR;
}
ElemType *p = &(L.elem[i-1]);
e = *p;
ElemType *q = L.elem+L.length-1;
for(++p; p<= q; ++p)
*(p-1) = *p;
--L.length;
return OK;
}//ListDelete_Sq
void Delete(SqList &L)
{
//删除指定位置
ElemType a;
int i;
printf("\n请输入删除位置(非正数则退出):");
scanf("%d",&i);
while(i>0)
{
if(ListDelete_Sq(L,i,a)!=0) //如果成功删除
printf("您删除了第%d条记录< %d >\n",i,a);
printf("\n请输入删除位置(非正数则退出):");
scanf("%d",&i);
}
}//Delete
Status GetElem(SqList &L,int i,ElemType &e)
{
//获得指定位置记录
if ((i<1) || (i>L.length))
{
printf("输入不合法!!!");
return ERROR;
}
e=L.elem[i-1];
return OK;
}//GetElem
void Get(SqList &L)
{
//获得指定位置输入
ElemType a;
int i;
printf("\n请输入查找位置(非正数则退出):");
scanf("%d",&i);
while(i>0)
{
if(GetElem(L,i,a)!=0)
printf("第%d个元素为< %d >\n",i,a);
printf("\n请输入查找位置(非正数则退出):");
scanf("%d",&i);
}
}//Get
void ClearList(SqList &L)
{
//清空顺序表
L.length=0;
}//ClearList
int LocateElem(SqList &L,ElemType e)
{
//查找某记录出现的第一次位置
for(int i=1;i<=L.length;i++)
if(L.elem[i-1]==e)
break;
if(i>L.length)
i=0;
return i;
}//LocateElem
void Locate(SqList &L)
{
//输入要查找的某记录
char c;
ElemType a;
int i;
do
{ printf("\n请输入一条待查询记录(整数):");
scanf("%d",&a);
i=LocateElem(L,a);
if(i==0)
printf("不存在此记录!!\n");
else
printf("%d是第%d条记录!!\n",a,i);
printf("\n是否继续查询记录(按y继续)?");
c=getche();
putchar('\n');
}while(c=='y');
}//Locate
int main()
{
SqList L;
InitList_sq(L); //自动初始化顺序表
while(1)
{
system("cls");
printf("\t0、输出所有记录\n");
printf("\t1、销毁顺序表\n");
printf("\t2、判断表空\n");
printf("\t3、测量表长\n");
printf("\t4、添加记录\n");
printf("\t5、插入记录\n");
printf("\t6、删除记录\n");
printf("\t7、查询记录\n");
printf("\t8、清空顺序表\n");
printf("\t9、取指定位置记录\n");
char c=getch();
while(c>'9' || c<'0')
c=getch();
printf("您选择了%c:\n\n",c);
switch(c)
{
case '0':OutputList_sq(L);
system("Pause");break;
case '1':DestroyList_sq(L);
printf("线性表已销毁!\n\n");
InitList_sq(L);
//销毁将重新初始化顺序表
printf("线性表已初始化!\n\n");
system("Pause");break;
case '2':
if(ListEmpty_Sq(L)==1)
printf("顺序表为空!!\n\n");
else
printf("顺序表不为空!!\n\n");
system("Pause");
break;
case '3':
printf("顺序表的长度为: %d\n\n",ListLength_Sq(L));
system("Pause");break;
case '4':Add(L);break;
case '5':Insert(L);break;
case '6':Delete(L);break;
case '7':Locate(L);break;
case '8':ClearList(L);
printf("线性表已清空!\n\n");
system("Pause");break;
case '9':Get(L);break;
default:break;
}
}
return 0;
}
2014-10-02 23:46