实验内容:请编制c语言程序,利用顺序存储方式实现下列功能:根据键盘输入数据建立一个线性表,并输出该线性表;然后根据屏幕菜单的选择,可以进行数据的插入、删除、查找,并在插入或删除数据后,再输出线性表;最后在屏幕菜单中选择结束按钮,即可结束程序的运行。完整代码: #include <stdio.h>
#include<iostream>
#define ERROR 0
#define OK 1
/*包含数据结构的预定义常量和类型P10 */
typedef int Status;
/*文件名大于8位出错*/
/*定义线性表内的元素类型为整数类型*/
typedef int ElemType;
/*线性表的动态分配顺序存储结构*/
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct {
ElemType* elem;
int length;
int listsize;
}SqList;
/*函数申明*/
Status InitList_Sq(SqList* L); /* 算法2.3 */
void Out_List(SqList L); /*补充,输出打印线性表*/
Status ListInsert_Sq(SqList* pL, int i, ElemType e); /* 算法2.4 */
Status ListDelete_Sq(SqList* L, int i, ElemType* e); /* 算法2.5 */
int LocateElem_Sq(SqList L, ElemType e, Status(*compare)(ElemType, ElemType)); /* 算法2.6 */
/*主函数*/
int main()
{
int i, k, loc; /* k ,菜单控制变量*/
ElemType e, x;
char ch;
SqList L;
SqList* p;
system("graftabl 936");/*调用MS_DOS中文支持*/
p = &L;/*p指向 L*/
do {
printf("\n========实验一:线性表 ===============");
printf("\n 1.建立线性表");
printf("\n 2.插入元素");
printf("\n 3.删除元素");
printf("\n 4.查找元素");
printf("\n 0.结束程序运行");
printf("\n=====================================");
printf("\n 请输入您的选择(1,2,3,4,0)\n");
scanf_s("%d", &k);
switch (k)
{
case 1: {loc = InitList_Sq(p);
printf("\n请输入线性表元素个数,并依次输入整数类型的元素值");
scanf_s("%d", &loc);
for (i = 1; i <= loc; i++) {
scanf_s("%d", &e);
ListInsert_Sq(p, i, e); /*也可以不处理函数返回值*/
}
Out_List(L);
}break;
case 2: { printf("\n请输入插入位置 及 整数类型的元素值");
scanf_s("%d%d", &loc, &e);
ListInsert_Sq(p, loc, e);
Out_List(L);
}break;
case 3: { printf("\n请输入要删除元素的位置:");
scanf_s("%d", &loc);
ListDelete_Sq(p, loc, &e);
Out_List(L);
}break;
case 4: { printf("\n请输入要查找的元素值:");
scanf_s("%d", &e);
int position = 0; // 初始化查找结果为0(未找到)
for (int i = 0; i < L.length; i++) {
if (L.elem[i] == e) { // 直接比较元素值
position = i + 1; // 找到元素,记录位序(从1开始)
break;
}
}
if (position != 0) {
printf("元素 %d 在线性表中的位序为: %d\n", e, position);
}
else {
printf("未找到元素 %d。\n", e);
}
Out_List(L); // 输出当前线性表的内容
}break;
case 0: { };
}
} while (k != 0);
printf("\n 按回车键,返回…\n");
ch = getchar();
}
Status InitList_Sq(SqList* L) { /* 算法2.3 */
/* 构造一个空的线性表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 */
Status ListInsert_Sq(SqList* L, int i, ElemType e) { /* 算法2.4 */
/* 在顺序线性表L的第i个元素之前插入新的元素e, */
/* i的合法值为1≤i≤ListLength_Sq(L)+1 */
ElemType* p, * q;
if (i < 1 || i > L->length + 1) return ERROR; /* i值不合法 */
if (L->length >= L->listsize) { /* 当前存储空间已满,增加容量 */
ElemType* newbase = (ElemType*)realloc(L->elem,
(L->listsize + LISTINCREMENT) * sizeof(ElemType));
if (!newbase) return ERROR; /* 存储分配失败 */
L->elem = newbase; /* 新基址 */
L->listsize += LISTINCREMENT; /* 增加存储容量 */
}
q = &(L->elem[i - 1]); /* q为插入位置 */
for (p = &(L->elem[L->length - 1]); p >= q; --p) *(p + 1) = *p;
/* 插入位置及之后的元素右移 */
*q = e; /* 插入e */
++L->length; /* 表长增1 */
return OK;
} /* ListInsert_Sq */
void Out_List(SqList L) {
int i;
printf("\n当前线性表为:");
for (i = 0; i < L.length; i++) printf("%10d", L.elem[i]);
}
Status ListDelete_Sq(SqList* L, int i, ElemType* e) { /* 算法2.5 */
/* 在顺序线性表L中删除第i个元素,并用e返回其值。 */
/* i的合法值为1≤i≤ListLength_Sq(L)。 */
ElemType* p, * q;
if (i<1 || i>L->length) return ERROR; /* i值不合法 */
p = &(L->elem[i - 1]); /* p为被删除元素的位置 */
*e = *p; /* 被删除元素的值赋给e */
q = L->elem + L->length - 1; /* 表尾元素的位置 */
for (++p; p <= q; ++p) *(p - 1) = *p; /* 被删除元素之后的元素左移 */
--L->length; /* 表长减1 */
return OK;
} /* ListDelete_Sq */
int LocateElem_Sq(SqList L, ElemType e,
Status(*compare)(ElemType, ElemType)) { /* 算法2.6 */
/* 在顺序线性表L中查找第1个值与e满足compare()的元素的位序。 */
/* 若找到,则返回其在L中的位序,否则返回0。 */
int i;
ElemType* p;
i = 1; /* i的初值为第1个元素的位序 */
p = L.elem; /* p的初值为第1个元素的存储位置 */
while (i <= L.length && !(*compare)(*p++, e))
++i;
if (i <= L.length) return i;
else return 0;
} /* LocateElem_Sq */ 根据实验内容和完整代码,在vs中,将代码中的整数类型改为字符类型,写出改为字符类型之后的完整代码(用c语言)