c语言的顺序表操作

这几天刚刚学完了顺序表的相关操作,也完成了老师布置的相关实验,发一篇文章记录一下学习状况。该篇的顺序表是以存放字符为依据的(%c),如果想要表中保存整型类的数据,可以将前面转定义的Elemtype改为int 

会使用到的一个重要函数:中断函数(主要就是为了吸收scanf之后的‘\n’)

void Interrupt()//中断函数 
{
	while (1) //用于检测换行符,使函数脱离scanf的连续输出 
	if (getchar() == '\n')
		break;
}

定义好顺序表

typedef struct//定义一个初始化的顺序表
{
	ElemType *elem;//基地址
	int length;
}Sqlist;

顺序表初始化

status InintList(Sqlist &L)//初始化
{
	L.elem = (ElemType*)malloc(sizeof(ElemType[MAX]));
	if (!L.elem)
	{
		printf("初始化失败!");
		return OVERFLOW;
	}
	L.length = 0;
	printf("初始化成功!");
	return ok;
}

顺序表的初始输入

status MyList(Sqlist &L)//起始输入内容
{
	int n, i; 
	ElemType j;
mark:Interrupt();
	printf("请输入要输入的初始元素个数:");
	scanf("%d", &n);
	if (n<1 || n>MAX)//防止手误输入数字以外的符号出现的无限循环
	{
		printf("输入错误!请重新输入");
		goto mark;
	}
	for (i = 0; i < n; i++)
	{
		Interrupt();//用于吸收上一个scanf剩余的\n的操作
		printf("请输入第%d个元素", i + 1); 
		scanf("%c", &j);
		L.elem[i] = j;

	}
	L.length = n;
	return ok;
}

输出顺序表内容

status DispList(Sqlist &L)//输出顺序表的内容
{
	int i;
	if (L.length == 0)
	{
		printf("空表\n");
		return 0;
	}
	else
	{
		printf("该表内容为:");
		for (i = 0; i < L.length; i++)
		{
			printf("%-5c",L.elem[i]);

		}
		return ok;
	}
}

插入顺序表

status ListInsert(Sqlist &L, int i, ElemType e)//插入顺序表
{
	int j;
mark:Interrupt();
	printf("请输入要插入的位置:");
	scanf("%d",&i);
	if (i<1 || i>L.length+1)
	{
		printf("输入错误,请重新输入!");
		goto mark;
    }
	if (L.length + 1 > MAX)
	{
		printf("该顺序表已达到上限,无法继续输入!");
		return 0;
    }
	Interrupt();
	printf("请输入要插入的元素:");
	scanf("%c", &e);
	for (j = L.length-1; j >= i - 1; j--)
	{
		L.elem[j + 1] = L.elem[j];
	}
	L.elem[i - 1]=e;
	++L.length;
	return ok;
}

删除顺序表某个元素

status ListDelete(Sqlist &L, int i)//在顺序表中删除第i个元素
{
	int j;
mark:Interrupt();
	printf("请输入要删除的元素位置:");
	scanf("%d", &i);
	if (i<1 || i>L.length)
	{
		printf("输入错误,请重新输入!");
		goto mark;
	}
	for (j = i; j <= L.length-1; j++)
	{
		L.elem[j - 1] = L.elem[j];
	}
	--L.length;
	return ok;
}

查找顺序表元素

status LocateElem(Sqlist &L, ElemType e)//查找元素e在顺序表的位置
{
	int i; 
	Interrupt();
	printf("请输入要查找位置的元素:");
	scanf("%c", &e);
	for (i = 0; i < L.length; i++)
	{
		if (L.elem[i] == e)
		{
			printf("该元素在顺序表第%d个位置", i + 1);
			return ok;
		}
	}
	printf("该元素不在顺序表中");
	return ok;
}

------------------------------------------------以上为顺序表的基本操作-----------------------------------------------

下方的完整代码还有求长度、释放、输出元素位置等等操作

代码会和书上的有所不同,因为我把一些操作都集成到原本的函数里面了,看一下大概的思路即可,当中一些输入用到了很多次那个“中断函数”,感觉是vs2013的scanf有bug ,输入完成后的那个回车会被下一个scanf吸收(猜测)

使用的编译器是:vs2013

下面就是我完成作业的代码(供参考,如果有错误的话还请指正,谢谢):

#define _CRT_SECURE_NO_WARNINGS//顺序表
#include <stdio.h>
#include <malloc.h>

//全局定义特殊变量
#define MAX 50
#define ok 1
#define OVERFLOW 0

//转定义区域
typedef char ElemType;
typedef int status;

typedef struct//定义一个初始化的顺序表
{
	ElemType *elem;//基地址
	int length;
}Sqlist;

//函数声明区域
void Interrupt();//创建一个中断函数 
status InintList(Sqlist &L);//初始化顺序表
status MyList(Sqlist &L);//输入顺序表的起始内容
status DestroyList(Sqlist &L);//释放顺序表(删除)
status ListEmpty(Sqlist &L);//判断顺序表是否为空
status listLength(Sqlist &L);//返回顺序表的的元素个数(长度)
status DispList(Sqlist &L);//输出顺序表的内容
status GetElem(Sqlist &L,int i,ElemType e);//获取顺序表第i个的元素
status LocateElem(Sqlist &L, ElemType e);//查找元素e在顺序表的位置
status ListInsert(Sqlist &L, int i, ElemType e);//在顺序表中第i位置插入元素e
status ListDelete(Sqlist &L, int i);//在顺序表中删除第i个元素

void Interrupt()//中断函数 
{
	while (1) //用于检测换行符,使函数脱离scanf的连续输出 
	if (getchar() == '\n')
		break;
}

status InintList(Sqlist &L)//初始化
{
	L.elem = (ElemType*)malloc(sizeof(ElemType[MAX]));
	if (!L.elem)
	{
		printf("初始化失败!");
		return OVERFLOW;
	}
	L.length = 0;
	printf("初始化成功!");
	return ok;
}

status DestroyList(Sqlist &L)//释放顺序表
{
	L.length = 0;
	printf("已经成功释放顺序表!");
	return ok;
}

status ListInsert(Sqlist &L, int i, ElemType e)//插入顺序表
{
	int j;
mark:Interrupt();
	printf("请输入要插入的位置:");
	scanf("%d",&i);
	if (i<1 || i>L.length+1)
	{
		printf("输入错误,请重新输入!");
		goto mark;
    }
	if (L.length + 1 > MAX)
	{
		printf("该顺序表已达到上限,无法继续输入!");
		return 0;
    }
	Interrupt();
	printf("请输入要插入的元素:");
	scanf("%c", &e);
	for (j = L.length-1; j >= i - 1; j--)
	{
		L.elem[j + 1] = L.elem[j];
	}
	L.elem[i - 1]=e;
	++L.length;
	return ok;
}

status listLength(Sqlist &L)//顺序表长度
{
	if (L.length == 0)
	{
		printf("该顺序表长度为0");
	}
	else
	{
		printf("该顺序表长度为%d",L.length);
	}
	return ok;
}

status ListDelete(Sqlist &L, int i)//在顺序表中删除第i个元素
{
	int j;
mark:Interrupt();
	printf("请输入要删除的元素位置:");
	scanf("%d", &i);
	if (i<1 || i>L.length)
	{
		printf("输入错误,请重新输入!");
		goto mark;
	}
	for (j = i; j <= L.length-1; j++)
	{
		L.elem[j - 1] = L.elem[j];
	}
	--L.length;
	return ok;
}

status MyList(Sqlist &L)//起始输入内容
{
	int n, i; 
	ElemType j;
mark:Interrupt();
	printf("请输入要输入的初始元素个数:");
	scanf("%d", &n);
	if (n<1 || n>MAX)//防止手误输入数字以外的符号出现的无限循环
	{
		printf("输入错误!请重新输入");
		goto mark;
	}
	for (i = 0; i < n; i++)
	{
		Interrupt();//用于吸收上一个scanf剩余的\n的操作
		printf("请输入第%d个元素", i + 1); 
		scanf("%c", &j);
		L.elem[i] = j;

	}
	L.length = n;
	return ok;
}

status LocateElem(Sqlist &L, ElemType e)//查找元素e在顺序表的位置
{
	int i; 
	Interrupt();
	printf("请输入要查找位置的元素:");
	scanf("%c", &e);
	for (i = 0; i < L.length; i++)
	{
		if (L.elem[i] == e)
		{
			printf("该元素在顺序表第%d个位置", i + 1);
			return ok;
		}
	}
	printf("该元素不在顺序表中");
	return ok;
}
status DispList(Sqlist &L)//输出顺序表的内容
{
	int i;
	if (L.length == 0)
	{
		printf("空表\n");
		return 0;
	}
	else
	{
		printf("该表内容为:");
		for (i = 0; i < L.length; i++)
		{
			printf("%-5c",L.elem[i]);

		}
		return ok;
	}
}

status GetElem(Sqlist &L, int i, ElemType e)//获取顺序表第i个的元素
{
    mark:Interrupt();
	printf("请输入要查找的元素位置:");
	scanf("%d",&i);
	if (i<1 || i>MAX)//防止手误输入数字以外的符号出现的无限循环
	{
		printf("输入错误!请重新输入");
		goto mark;
	}
	if (i<1 || i>L.length)
	{
		printf("没有该位置的元素!");
		return 0;
	}
	e = L.elem[i - 1];
	printf("顺序表的第%d个位置元素为:%c",i,e);


}

status ListEmpty(Sqlist &L)//判断顺序表是否为空
{
	if (L.length == 0)
	{
		printf("该顺序表为空");//实际上返回值是T
	}
	else
	{
		printf("该顺序表不为空");//实际上返回值是F
	}
	return ok;
}

int main()
{
	int a,f=0,i=0;
	ElemType e=0;
	Sqlist L;//定义好顺序表
	while (1)
	{
		printf("\n");
		printf("================================\n");
		printf("|        顺序表操作系统        |\n");
		printf("================================\n");
		printf("|        1.初始化顺序表        |\n");
		printf("|        2.起始顺序输入元素    |\n");
		printf("|        3.输出顺序表内容      |\n");
		printf("|        4.输出顺序表长度      |\n");
		printf("|        5.判断顺序表情况      |\n");
		printf("|        6.输出指定位置元素    |\n");
		printf("|        7.输出指定元素位置    |\n");
		printf("|        8.插入顺序表指定位置  |\n");
		printf("|        9.删除顺序表指定位置  |\n");
		printf("|        10.释放顺序表         |\n");
		printf("|        0.退出顺序表操作系统    |\n");
		printf("================================\n");
		printf("请选择功能(0-10):");
	mark:scanf("%d", &a);
		switch (a)
		{
		case 0:f = 1; break;
		case 1:InintList(L); break;
		case 2: MyList(L); break;
		case 3: DispList(L); break;
		case 4:listLength(L); break;
		case 5: ListEmpty(L); break;
		case 6: GetElem(L, i, e); break;
		case 7: LocateElem(L, e); break;
		case 8:  ListInsert(L, i, e); break;
		case 9:ListDelete(L, i); break;
		case 10: DestroyList(L); break;
		default:printf("选择功能错误!请重新选择菜单功能:"); goto mark;
		}
		if (f == 1)
		{
			printf("已经退出系统");
			break;//该break是为了退出while的无限“菜单”循环
		}
	}
}

  • 9
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值