赞
踩
这几天刚刚学完了顺序表的相关操作,也完成了老师布置的相关实验,发一篇文章记录一下学习状况。该篇的顺序表是以存放字符为依据的(%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的无限“菜单”循环
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。