#include
#include
#define MAXLEN 100 //定义常量MAXLEN为10表示存储空间总量
typedef int DataType; //定义DataType为int类型
typedef struct //顺序表存储类型
{ DataType data[MAXLEN]; //存放线性表的数组
int Length; //Length 顺序表长度
}Seqlist;
void InitList(Seqlist *L)
{
L->Length=0; /*初始化顺序表为空*/
};
void CreateList(Seqlist *L,int n) /*建立顺序表并输入多个元素函数*/
{ int i;
printf("请输入和%d个整数:",n);
for(i=0;i"%d",&L->data[i]) ;
L->Length=i; //设线性表的长度为i
}
int GetElem(Seqlist *L,int i,DataType *x) //按顺序查找,,获取顺序表中第i位元素
{ if(i<1||i>L->Length) // 当查找位置i不正确时;
return 0;
else
{
*x=L->data[i-1]; //将顺序表中第i个元素赋给指针x 所指变量
return 1;
}
}
int Locate(Seqlist *L,DataType x) //按值查找,,在顺序表L中定位元素x函数
{ int i=0;
while(iLength&&L->data[i]!=x)
i++;
if(i>=L->Length)
return 0;
else
return i+1;
}
int InsElem(Seqlist *L,int i,DataType x) //在顺序表中第i位插入元素x
{ int j;
if(L->Length>=MAXLEN)
{ printf("顺序表已满!");
return -1;
}
if(i<1||i>L->Length+1)
{
printf("插入位置出错!");
return 0;
}
if(i==L->Length+1) //插入的位置为表尾,不需要移动直接插入
{ L->data[i-1]=x;
L->Length++;
return 1;
}
for(j=L->Length-1;j>=i-1;j--) //插入表中某位置,插入点后各结点向后移
{ L->data[j+1]=L->data[j];
L->data[i-1]=x; //插入元素x
L->Length++; //顺序表长度+1
return 1;
}
}
int DelElem(Seqlist *L,int i,DataType *x) //在顺序表中删除第i位元素
{ int j;
if(L->Length==0)
{
printf("顺序表为空!");
return 0;
}
if(i<1||i>L->Length)
{
printf("不存在第i个元素");
return 0;
}
*x=L->data[i-1];
for(j=i;jLength;j++)
{
L->data[j-1]=L->data[j];
L->Length--;
return 1;
}
}
void DispList(Seqlist *L)//显示输出顺序表L中的每一个元素函数
{
int i;
for(i=0;iLength;i++)
{
printf("%5d",L->data[i]);
}
}
void Menu()
{
printf("\n 顺序表的各种操作");
printf("\n================================================================");
printf("\n 1------建立顺序表");
printf("\n 2------插入元素 ");
printf("\n 3------删除元素") ;
printf("\n 4------按位置查找元素");
printf("\n 5------按元素值查找其在其中的位置");
printf("\n 6------求顺序表的长度");
printf("\n 0-------返回");
printf("\n=================================================================");
printf("\n 请输入菜单号(0~6)");
}
void main()
{
Seqlist L;
DataType x;
int n,i,loc;
char ch1,ch2,a;
ch1='y';
while(ch1=='y'||ch1=='Y')
{
Menu();
scanf("%c",&ch2);
getchar();
switch(ch2)
{
case '1':
InitList(&L) ;
printf("将输入建立线性表的个数");
scanf("%d",&n);
CreateList(&L,n);
printf("建立的线性表为:");
DispList(&L);
break;
case '2':
printf("请输入要插入的位置");
scanf("%d",&i);
printf("请上输入要插入的元素值:");
scanf("%d",&x);
if(InsElem(&L,i,x))
{
printf("已成功在%d的位置上插入%d,插入后的线性表为:\n",i,x);
DispList(&L);
}
else
printf("输入插入的参数错误!");
break;
case'3':
printf("请输入删除元素的位置");
scanf("%d",&i);
if(DelElem(&L,i,&x))
{
printf("已成功在%d的位置上删除%d,删除后的线性表为:\n",i,x);
DispList(&L);
}
else
printf("输入删除的参数错误");
break;
case'4':
printf("请输入要查看表中元素位置(从1开始)");
scanf("%d",&i);
if(GetElem(&L,i,&x))
printf("当前线性表第%d的位置为:%d",i,x);
else
printf("输入的位置错误");
break;
case'5':
printf("请输入要查找的元素值为:");
scanf("%d",&x);
loc=Locate(&L,x);
if(loc)
printf("查找元素为%d的位置为:%d",x,loc);
else
printf("该表中无此元素!");
break;
case'6':
printf("当前线性表的长度为:%d",L.Length);
break;
case'0':
ch1='n';
break;
default:
printf("输入有误,请输入0~6进行选择");
}
if(ch2!='0')
{
printf("\n按回车键继续,按任意键返回主菜单!\n");
a=getchar();
if(a!='\xA')
{
getchar();
ch1='n';
}
}
}
}
求代佬指点 代码如上 使用插入和删除功能时出现 如图的错误 看书上自己调试的找不出问题
修改完善如下,供参考:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h> // 修改
#define MAXLEN 100 //定义常量MAXLEN为10表示存储空间总量
typedef int DataType; //定义DataType为int类型
typedef struct //顺序表存储类型
{
DataType data[MAXLEN]; //存放线性表的数组
int Length; //Length 顺序表长度
}Seqlist;
void InitList(Seqlist* L)
{
L->Length = 0; /*初始化顺序表为空*/
};
void CreateList(Seqlist* L, int n) /*建立顺序表并输入多个元素函数*/
{
int i;
printf("请输入和%d个整数:", n);
for (i = 0; i < n; i++)
scanf("%d", &L->data[i]);
L->Length = i; //设线性表的长度为i
}
int GetElem(Seqlist* L, int i, DataType* x) //按顺序查找,,获取顺序表中第i位元素
{
if (i<1 || i>L->Length) //当查找位置i不正确时;
return 0;
else
{
*x = L->data[i - 1]; //将顺序表中第i个元素赋给指针x 所指变量
return 1;
}
}
int Locate(Seqlist* L, DataType x) //按值查找,,在顺序表L中定位元素x函数
{
int i = 0;
while (i < L->Length && L->data[i] != x)
i++;
if (i >= L->Length)
return 0;
else
return i + 1;
}
int InsElem(Seqlist* L, int i, DataType x) //在顺序表中第i位插入元素x
{
int j;
if (L->Length >= MAXLEN)
{
printf("顺序表已满!");
return -1;
}
if (i < 1 || i > L->Length + 1)
{
printf("插入位置出错!");
return 0;
}
if (i == L->Length + 1) //插入的位置为表尾,不需要移动直接插入
{
L->data[i - 1] = x;
L->Length++;
return 1;
}
for (j = L->Length - 1; j >= i - 1; j--) //插入表中某位置,插入点后各结点向后移
{
L->data[j + 1] = L->data[j];
} //修改
L->data[i - 1] = x; //插入元素x 修改
L->Length++; //顺序表长度+1 修改
return 1;
//}
}
int DelElem(Seqlist* L, int i, DataType* x) //在顺序表中删除第i位元素
{
int j;
if (L->Length == 0)
{
printf("顺序表为空!");
return 0;
}
if (i<1 || i>L->Length)
{
printf("不存在第%d个元素", i); //修改
return 0;
}
*x = L->data[i - 1];
for (j = i; j < L->Length; j++)
{
L->data[j - 1] = L->data[j];
} //修改
L->Length--; //修改
return 1; //修改
//}
}
void DispList(Seqlist* L)//显示输出顺序表L中的每一个元素函数
{
int i;
for (i = 0; i < L->Length; i++)
{
printf("%5d", L->data[i]);
}
}
void Menu()
{
printf("\n 顺序表的各种操作");
printf("\n================================================================");
printf("\n 1------建立顺序表");
printf("\n 2------插入元素 ");
printf("\n 3------删除元素");
printf("\n 4------按位置查找元素");
printf("\n 5------按元素值查找其在其中的位置");
printf("\n 6------求顺序表的长度");
printf("\n 0-------返回");
printf("\n=================================================================");
printf("\n 请输入菜单号(0~6)");
}
void main()
{
Seqlist L;
DataType x;
int n, i, loc;
char ch1, ch2, a;
ch1 = 'y';
InitList(&L); //修改
while (ch1 == 'y' || ch1 == 'Y')
{
Menu();
scanf(" %c", &ch2);
getchar();
switch (ch2)
{
case '1':
//InitList(&L); //修改
printf("将输入建立线性表的个数");
scanf("%d", &n);
CreateList(&L, n);
printf("建立的线性表为:");
DispList(&L);
break;
case '2':
printf("请输入要插入的位置");
scanf("%d", &i);
printf("请上输入要插入的元素值:");
scanf("%d", &x);
if (InsElem(&L, i, x))
{
printf("已成功在%d的位置上插入%d,插入后的线性表为:\n", i, x);
DispList(&L);
}
else
printf("输入插入的参数错误!");
break;
case'3':
printf("请输入删除元素的位置");
scanf("%d", &i);
if (DelElem(&L, i, &x))
{
printf("已成功在%d的位置上删除%d,删除后的线性表为:\n", i, x);
DispList(&L);
}
else
printf("输入删除的参数错误");
break;
case'4':
printf("请输入要查看表中元素位置(从1开始)");
scanf("%d", &i);
if (GetElem(&L, i, &x))
printf("当前线性表第%d的位置为:%d", i, x);
else
printf("输入的位置错误");
break;
case'5':
printf("请输入要查找的元素值为:");
scanf("%d", &x);
loc = Locate(&L, x);
if (loc)
printf("查找元素为%d的位置为:%d", x, loc);
else
printf("该表中无此元素!");
break;
case'6':
printf("当前线性表的长度为:%d", L.Length);
break;
case'0':
ch1 = 'n';
break;
default:
printf("输入有误,请输入0~6进行选择");
}
if (ch2 != '0') //修改
{
printf("\n按任意键返回主菜单!\n");
_getch(); //修改
//a = getchar(); //修改
//if (a != '\xA')
//{
// getchar();
// ch1 = 'n';
//}
}
}
}
59、79行的return 1你不能放到for循环里啊。要放到循环结束以后,否则循环只执行了一次就结束了,结果当然不对了
不知道你这个问题是否已经解决, 如果还没有解决的话: