SeqList L;//L只是个默认构造,在后面执行基本是统一的0值;执行前应该设置实体数据
创新互联建站主要从事成都做网站、成都网站建设、成都外贸网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务张家港,十年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108
L=Selection(L.length);//改为L=Selection(L);原函数调用与函数定义不符,有语法错误;L.length是个int 类型,函数定义的参数类型是SeqList;
SeqList Selection(SeqList L) 内部逻辑不够简捷,多多练习;
if (L.data[j]L.data [i]){}//可直接交换,k标志没什么作用。
你的代码中的插入和删除操作根本就无法实现,应为函数无法修改main()函数中传入的实参变量的,把形参改成指针才行
代码改成如下:
#include stdio.h
#define Maxsize 50
#define FALSE 0
#define TRUE 1
typedef int ElemType;
typedef int Status;
typedef struct{
ElemType data[Maxsize];
int length;
}SqList;
Status LocateElem(SqList L,int e){//按值查找
int i;
if(L.length==0)
return FALSE;
for(i=0;iL.length;i++){
if(L.data[i]==e)
return i+1;
}
return FALSE;
}
Status Insert(SqList *L,int i,int e){//插入操作 //修改成指针
int j;
if(L-length==Maxsize) //把 .改成 -
return FALSE;
if(i1||iL-length+1)
return FALSE;
for(j=L-length-1;j=i-1;j--) //把 .改成 -
L-data[j+1]=L-data[j];//把 .改成 -
L-data[i-1]=e;//把 .改成 -
L-length++;//把 .改成 -
return TRUE ;
}
Status Delete(SqList * L,int i){//删除操作 //修改成指针
int j;
if(L-length==0)//把 .改成 -
return FALSE;
for(j=i;jL-length;j++){//把 .改成 -
L-data[j-1]=L-data[j];//把 .改成 -
}
L-length--;//把 .改成 -
return TRUE;
}
SqList CreateList(SqList L){
int i;
L.length=30;
for(i=0;iL.length;i++){
L.data[i]=i+1;
}
return L;
}
void printSqList(SqList L){
int i;
for(i=0;iL.length;i++){
printf("顺序表第%d个元素值为%d\n",i+1,L.data[i]);
}
printf("\n\n");
}
void main(){
int k;
int e; //待查元素
int insertData;//待插元素
int insert_location,delete_location;//插入位置及删除位置
int isInserted,isDeleted;//判断是否插入或删除成功
SqList L=CreateList(L);
printSqList(L);
printf("请输入您要查找的值:");
scanf("%d",e);
k=LocateElem(L,e);
printf("您要查找的值在顺序表第%d个\n",k);
printf("\n\n");
printf("请输入您要插入的位置:");
scanf("%d",insert_location);
printf("\n");
printf("请输入您要插入的值:");
scanf("%d",insertData);
isInserted=Insert(L,insert_location,insertData);
if(isInserted){
printf("%d",L.data[insert_location-1]);
}
printf("\n\n");
printf("请输入您要删除的位置:");
scanf("%d",delete_location);
printf("\n");
isDeleted=Delete(L,delete_location);
if(isDeleted){
printf("\n");
printSqList(L);
}
}
如果是C++可以把函数变成引用,那更简单
完整代码:
#include stdio.h
#include stdlib.h
#include windows.h
#define MAXSIZE 100
typedef int datatype;
typedef struct{
datatype a[MAXSIZE];
int size;
}sequence_list;
void init(sequence_list *slt)
{
slt-size=0;
}
void append(sequence_list *slt,datatype x)
{
if(slt-size==MAXSIZE)
{
printf("顺序表是满的");
exit(1);
}
slt-a[slt-size]=x;
slt-size=slt-size+1;
}
void display (sequence_list slt)
{
int i;
if(!slt.size)
printf("顺序表是空的");
else
for(i=0;islt.size;i++)
printf("%5d",slt.a[i]);
printf("\n");
}
int empty (sequence_list *slt)
{
memset(slt,0,sizeof(sequence_list));
return(slt-size==0?1:0);
}
int find (sequence_list slt,datatype x)
{
int i=0;
while(islt.size slt.a[i]!=x)
i++;
return(islt.size ? i:-1);
}
datatype get(sequence_list slt,int i)
{
if(i0||i=slt.size)
{
printf("\n指定位置的节点不存在");
exit(1);
}
else
return slt.a[i];
}
void insert(sequence_list *slt,datatype x,int position)
{
int i;
if(slt-size==MAXSIZE)
{
printf("\n顺序表是满的,无法插入");
exit(1);
}
if(position0||positionslt-size)
{
printf("\n指定的插入位置不存在");
exit(1);
}
for(i=slt-size;iposition;i--)
slt-a[i]=slt-a[i-1];
slt-a[position]=x;
slt-size++;
}
void dele(sequence_list *slt,int position)
{
int i;
if(slt-size==0)
{
printf("\n顺序表是空的,无法删除");
exit(1);
}
if(position0||position=slt-size)
{
printf("\n指定的删除位置不存在");
exit(1);
}
for(i=position;islt-size-1;i++)
slt-a[i]=slt-a[i+1];
slt-size--;
}
int main()
{
sequence_list slt;
bool exit_flag=false;
int fun_num=1;
datatype data=0;
int i=0;
printf("1.初始化 2.增加节点 3.显示 4.清空 5.查找\n6.获取节点 7.插入节点 8.删除节点 9.退出 0.清屏\n");
while (!exit_flag)
{
printf("请选择功能:\n");
scanf("%d",fun_num);
switch (fun_num)
{
case 1:
init(slt);
break;
case 2:
printf("请输入数据:\n");
scanf("%d",data);
append(slt,data);
break;
case 3:
display (slt);
break;
case 4:
empty (slt);
break;
case 5:
printf("请输入查找的数据:\n");
scanf("%d",data);
printf("查找到的数据位置为:%d",find (slt,data));
printf("\n");
break;
case 6:
printf("请输入数据位置:\n");
scanf("%d",i);
printf("该位置的数据为:%d",get(slt,i));
printf("\n");
break;
case 7:
printf("请输入插入节点位置:\n");
scanf("%d",i);
printf("请输入插入节点数据:\n");
scanf("%d",data);
insert(slt,data,i);
break;
case 8:
printf("请输入删除节点位置:\n");
scanf("%d",i);
dele(slt,i);
break;
case 9:
exit_flag=true;
break;
case 0:
system("CLS");
printf("1.初始化 2.增加节点 3.显示 4.清空 5.查找\n6.获取节点 7.插入节点 8.删除节点 9.退出 0.清屏\n");
break;
default:
break;
}
}
return 0;
}
效果如下图,调试通过,所有功能好使
#include stdio.h
#include stdlib.h
typedef int DataType; // 定义数据数据类型
typedef struct {
DataType *data; // data指向数据区的首个数据
int length; // 数据长度
}SqList;
void Sort(SqList *L) {
int i,j,k;
DataType tmp;
for(i = 0; i L-length - 1; ++i) {
k = i;
for(j = i + 1; j L-length; ++j)
if(L-data[k] L-data[j])
k = j;
if(k != i) {
tmp = L-data[k];
L-data[k] = L-data[i];
L-data[i] = tmp;
}
}
}
SqList *CreateList(DataType a[],int n) {
int i;
SqList *L;
L = (SqList *)malloc(sizeof(SqList));
L-data = (DataType *)malloc(n * sizeof(DataType));
L-length = n;
for(i = 0; i n; ++i) L-data[i] = a[i];
Sort(L);
return L;
}
int InsertList(SqList *L,DataType x) {
int i,j;
for (i = 0;i L-length;i++) {
if(x = L-data[i]) {
for(j = L-length;j = i;j--)
L-data[j + 1] = L-data[j]; // 结点后移
L-data[i] = x;
L-length++;
return 1;
}
}
L-data[L-length++] = x;
return 1;
}
int RemoveListElem(SqList *L,DataType d) {
int i,j;
for(i = 0; i L-length; ++i) {
if(L-data[i] == d) {
for(j = i; j L-length - 1; ++j)
L-data[j] = L-data[j + 1];
L-length--;
return 1;
}
}
return 0;
}
SqList *AndList(SqList *A, SqList *B) { /* A∩B */
int i,j,k = 0;
int len = (A-length B-length) ? B-length : A-length;
SqList *C = (SqList *)malloc(sizeof(SqList));
C-length = len;
C-data = (DataType *)malloc(len * sizeof(DataType));
for(i = 0; i A-length; ++i) {
for(j = 0; j B-length; ++j) {
if(A-data[i] == B-data[j]) {
C-data[k++] = A-data[i];
break;
}
}
}
C-length = k;
return C;
}
SqList *OrList(SqList *A, SqList *B) { /* A∪B */
int i,j,flag;
DataType e;
SqList *C = (SqList *)malloc(sizeof(SqList));
C-length = A-length + B-length;
C-data = (DataType *)malloc(C-length * sizeof(DataType));
for(i = 0; i A-length; ++i) C-data[i] = A-data[i];
for(i = 0; i B-length; ++i) {
e = B-data[i];
flag = 1;
for(j = 0; j C-length; ++j) {
if(e == C-data[j]) {
flag = 0;
break;
}
}
if(flag) InsertList(C,e);
}
return C;
}
void PrintList(SqList *L) {
int i;
for(i = 0; i L-length; ++i)
printf("%d ",L-data[i]);
printf("\n");
}
void FreeList(SqList *L) {
free(L-data);
free(L);
}
void main() {
DataType x;
DataType arra[] = {36,24,31,5,90,65,70,39,37};
DataType arrb[] = {9,8,43,51,37,89,33,46,29,80,56};
int alen = sizeof(arra)/sizeof(arra[0]);
int blen = sizeof(arrb)/sizeof(arrb[0]);
SqList *A = CreateList(arra,alen);
printf("A线性表为: ");
PrintList(A);
SqList *B = CreateList(arrb,blen);
printf("B线性表为: ");
PrintList(B);
SqList *C = AndList(A,B);
SqList *D = OrList(A,B);
printf(" C = A∩B: ");
PrintList(C);
printf(" D = A∪B: ");
PrintList(D);
printf("在D表中插入数据 : ");
scanf("%d",x);
InsertList(D,x);
printf("D表插入x后 :");
PrintList(D);
printf("删除D表中数据 : ");
scanf("%d",x);
RemoveListElem(D,x);
printf("删除x后的D表为 :");
PrintList(D);
FreeList(A);
FreeList(B);
FreeList(C);
FreeList(D);
}