您的位置:首页 > 其它

我的线性表(顺序表)

2015-10-01 17:16 239 查看
啦啦啦……写了将近一上午,功能不太全,只写了老师要求写的功能,待会儿我把其他功能补充下再粘贴一个

这个只有1:定义线性表,2:初始化线性表,3:删除第i个位置的元素,4:删除值为e的元素,5:查找第i个位置上的元素,6:打印顺序表 7:销毁顺序表

#include <stdio.h>
#include <malloc.h>
#define LISTINCREMENT 10
typedef struct
{
int *elem;
int length;
int listsize;
}SqList;

void printMenu();//打印功能选择菜单
bool initListSq(SqList &L, int len); //初始化线性表,成功则返回1,失败返回0
bool listInsertSq(SqList &L, int i, int e);//在线性表的第i个位置插入元素e
bool listDataDeleteSq(SqList &L, int &i, int e); //删除顺序表中元素e,并返回它的位置i
bool listLocationDeleteSq(SqList &L, int i, int &e);//删除顺序表中第i个位置的元素,并返回元素的值e
bool locateElemSq(SqList &L, int &i, int e);//查找某个元素,找到则返回它的位置,否则返回0
void listPrintSq(SqList &L); //打印该线性表
void destorySq(SqList &L); //销毁该线性表

void printMenu()
{
printf("  请选择对该线性表的操作:\n");
printf("1:插入一个元素\n");
printf("2:删除顺序表中第i个元素,并输出它的值e\n");
printf("3:删除顺序表中的元素e,并输出其位置\n");
printf("4:查找某个元素,找到则输出它的位置,否则输出0\n");
printf("5:打印该顺序表\n");
printf("6:销毁该顺序表\n");
printf("q:退出程序\n");
}
int main()
{
int len, quik = 0;
SqList La;
char choice;
printf("请输入建立的顺序表的元素个数:");
scanf("%d", &len);
initListSq(La, len);
for(;;) //用户在选择退出之前可以根据菜单随意对线性表进行操作;
{
int i, e;
bool check;
printMenu();
getchar();
scanf("%c", &choice);
switch(choice)
{
case '1':
printf("请输入要插入的元素位置和元素的值:(1 <= i <= %d)", La.length+1);
scanf("%d%d", &i, &e);
check = listInsertSq(La, i, e);
if(check)
printf("插入成功!\n");
else
printf("插入失败!(请检查输入的位置是否在合法范围)\n");
break;
case '2':
printf("请输入要删除的元素的位置:");
scanf("%d", &i);
check = listLocationDeleteSq(La, i, e);
if(check)
printf("删除成功!\n");
else
printf("删除失败!(请检查输入的位置的范围或者该表是否为空)\n");
break;
case '3':
printf("请输入要删除的元素的值:");
scanf("%d", &e);
check = listDataDeleteSq(La, i, e);
if(check == 1)
printf("删除成功!\n");
else
printf("删除失败!(请检查您输入的值是否存在于线性表中)");
break;
case '4':
printf("请输入要查找的元素:");
scanf("%d", &e);
check = locateElemSq(La, i, e);
if(check)
printf("找到了,该元素在线性表中的第%d个位置上\n", i);
else
printf("sorry, 没找到哎,要不您再检查一下输入的元素是否是线性表中的元素?");
case '5':
listPrintSq(La);
break;
case '6':
destorySq(La);
printf("销毁完成!\n");
case 'q':
quik = 1;break;
default:
printf("您输入的数字不在范围内,请重新输入\n");
}
if(quik)
{
printf("感谢您的使用,再见\n");
break;
}
}
return 0;
}

bool initListSq(SqList &L, int len) //构造一个空的线性表,成功则返回1,失败返回0
{
L.elem = (int *)malloc(len*sizeof(int));
if(!L.elem) exit(0);
L.length = 0;
L.listsize = len;
return 1;
}
bool listInsertSq(SqList &L, int i, int e)
{
//在顺序线性表中第i个位置插入新的元素e
//i的范围 1 <= i <= L.listsize + 1
if(i < 1 || i > L.length+1) return 0;
if(L.length >= L.listsize)
{
int *newbase = (int *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(int));
if(!newbase) exit(0); //存储分配失败
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
int *q = &(L.elem[i-1]), *p;
for(p = &(L.elem[L.length-1]); p >= q; p--) *(p+1) = *p;
*q = e;
++L.length;
return 1;
}
bool listLocationDeleteSq(SqList &L, int i, int &e)//删除顺序表中第i个位置上的元素,并用e返回其值
{
//i的范围:1 <= i <= L.listsize;
if(L.length == 0) return 0;
if(i < 1 || i > L.listsize) return 0;
int *p = &(L.elem[i-1]), *q;
e = *p;
q = L.elem + L.listsize;
for(p++; p < q; p++) *(p-1) = *p;
--L.length;
return 1;
}
bool locateElemSq(SqList &L, int &i, int e)//查找某个元素,找到则返回它的位置,否则返回0
{
if(L.length == 0) return 0;
i = 1;
while(i <= L.length && L.elem[i-1] != e) ++i;
if(i <= L.length) return 1;
else return 0;
}
bool listDataDeleteSq(SqList &L, int &i, int e)//删除顺序表中值为e的元素,并用i返回它的位置
{
if(L.length == 0) return 0;
int i1;
bool flag;
flag = locateElemSq(L, i1, e);
if(flag)
{
listLocationDeleteSq(L, i1, e);
return 1;
}
else
return 0;
}

void listPrintSq(SqList &L) //打印该线性表
{
if(L.length == 0) {printf("该顺序表为空\n"); return ;}
printf("该顺序表如下:\n");
for(int i = 0; i < L.length; i++)
{
printf("%d ", L.elem[i]);
if(i != 0 && i % 6 == 0)
printf("\n");
}
printf("\n");
}
void destorySq(SqList &L) //销毁该线性表
{
free(L.elem);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: