首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

帮忙看看哪里出了有关问题好吗?关于线形表的有关问题

2012-02-10 
各位高手帮忙看看哪里出了问题好吗?关于线形表的问题#includestdio.h#includestdlib.h//malloc文件要

各位高手帮忙看看哪里出了问题好吗?关于线形表的问题
#include<stdio.h>
#include<stdlib.h>//malloc文件要包含的头文件
#define LIST_INSTSIZE 50
typedef int DataType;
typedef struct //线性表的动态分配顺序存储结构
{
DataType *elem;
int length;
int listsize;
}SepList;
int InitSepList(SepList *L) //构造一个空的线性表
{
L->elem=(DataType*)malloc((LIST_INSTSIZE+1)*sizeof(DataType));
if(!L->elem)
return 0;//返回空间不成功
L->length=0;
L->listsize=LIST_INSTSIZE;
return 1;
}
void one(SepList *L) //未输入线性表中的数据,功能1
{
int i,a; //定义a变量,代表数据个数,i是循环变量
printf("请先输入顺序表的数据个数,然后输入数据,完成1号功能。\n");
printf("数据个数为:");
scanf("%d",&a);
printf("开始输入数据,中间用空格隔开。");
for(i=1;i<=a;i++)

  if(L->listsize-L->length<=0) //先判断空的线性表是否构造成功
{
  L->elem=(DataType*)malloc((LIST_INSTSIZE+1)*sizeof(DataType));  
if(!L->elem)
{printf("分配空间失败!\n");
exit(1);
}
L->listsize=L->listsize+LIST_INSTSIZE;
 
}
++L->length; //输入的同时计算表长
scanf( "%d", L->elem+L->length-1); //开始循环输入数,此时,表的长度为用户输入的数据个数,即L->length=a
}
printf("如果想看你输入的线性表,请选择7号功能。\n");

}
void two(SepList *L) //插入数据到顺序表
{  
DataType e, *newbase, *q,*p;
int i;
printf("请分别提供插入的数据位置和需要插入的数据,完成2号功能。\n");
printf("插入到第几号元素之后?");
scanf("%d",&i);
printf("\n插入的元素是:");
scanf("%d",&e);

if(i<1||i>L->length+1)
{printf("插入的地方不合法。\n");
exit(1);} //i值不合法
if(L->length>=L->listsize)
{
newbase=(DataType *)realloc(L->elem,(L->listsize+LIST_INSTSIZE)*sizeof(DataType));
if(!newbase)
{printf("分配空间失败。\n"); 
exit(1);}//分配空间失败
L->elem=newbase;
L->listsize+=LIST_INSTSIZE;
}
q=&(L->elem[i-1]);
for(p=&(L->elem[L->length-1]);p>=q;--p)*(p+1)=*p;
*q=e;
++L->length;
printf("数据已经插入成功。\n");
}
void three(SepList *L) //删除线形表
{
  int i;
DataType e,*p,*q;
printf("请提供删除的数据位置,完成3号功能。");
scanf("%d",&i);
if((i<1)||(i>L->length))
{printf("输入的数据无效。\n");
exit(1);}  
p=&(L->elem[i-1]);
e=*p;
q=L->elem+L->length -1;
for(++p;p<=q;++p)*(p-1)=*p;
--L->length;
printf("数据已经删除。\n");
 
}
void four(SepList *L) //求表长
{
printf("线形表为:");
  printf("L->length\n");
}
void five(SepList *L) //按值查找
{
DataType a; //要查找的数据
  int i; //用来控制长度
  DataType *p;  
printf("请输入要查找的数据:");
scanf("%d",&a);
printf("\n");
  i=1;  
  p=L->elem; //把首地址给p 
  while(i<=L->length && *p++!=a) ++i;  
  if(i<=L->length)  
{ printf("\n%d 在第%d个位置: \n",a,i); }//不超过长度的条件下找到  
  else  
{printf("\n所给的数不在线形表的范围里面\n");} //超过长度即找不到  
   
}
void six(SepList *L) //读取元素的值
{
  int i,a; //用户输入要查找的数据的位置,a用于计算
DataType *p; 
printf("请输入要查找多少号的数据:");
scanf("%d",&i);
printf("\n");
a=1;
  p=L->elem; //把线形表的首地址给p
while(i!=a)
{a++;


p++;}
if(a<=L->length)
{
  printf("%d 所对应线形表中的数是:%d\n",i,*p);
}
  else
{
printf("找不到所对应的数。\n");
}


}
void serven(SepList *L) //显示输出线形表
{

  int i; 
int n;
n=L->length;
  i=0;  
  printf("线形表是:\n");  
  for(i=0;i<n;i++) //循环输出
  printf("%d ",*L->elem++);  
   
}
int eight(SepList *L) //退出功能
{
printf("你已经退出操作\n");
return 0;
}
void main()
{  
int c,a; //定义变量c,代表用户所选择的功能
SepList mylist;
   
int InitSepList(SepList *L); //函数的声明
void one(SepList *L);
void two(SepList *L);
void three(SepList *L);  
void four(SepList *L);
void five(SepList *L); 
void six(SepList *L);  
void serven(SepList *L);
int eight(SepList *L);
printf("\n\n\n\n");
printf("\n\t\t\t********************************");
printf("\n\t\t\t* 1-------顺序表初始化 *");
  printf("\n\t\t\t* 2-------插入 *");
  printf("\n\t\t\t* 3-------删除 *");
  printf("\n\t\t\t* 4-------求表长 *");
printf("\n\t\t\t* 5-------按值查找 *");
printf("\n\t\t\t* 6-------读取元素 *");
printf("\n\t\t\t* 7-------显示线性表 *");
printf("\n\t\t\t* 0-------退出 *");
printf("\n");
  printf("请按照提示输入要执行的功能,如果之前没有顺序表,请先选择1号功能,\n完成顺序表的初始化。\n");
scanf("%d",&c);
  if(c=1) //这里实现分支
{
one(&mylist);
printf("请继续输入要执行的功能:");
scanf("%d",a);
}
switch(a)
{
case 2: two(&mylist);break;
case 3: three(&mylist);break;
case 4: four(&mylist);break;
case 5: five(&mylist);break;
case 6: six(&mylist);break;
case 7: serven(&mylist);break;
case 0: eight(&mylist);break;
}
}




这个程序通过了编译,但是调试的时候不成功,可是我找了很久还是找不到是哪里出问题了,希望各位高手指点一下!!谢谢!!!

[解决办法]
改动了一些代码,都注释了,大概调试了一下,功能都能实现了

C/C++ code
#include <stdio.h> 
#include <iostream.h>
#include <stdlib.h>//malloc文件要包含的头文件
#define LIST_INSTSIZE 50
typedef int DataType;
typedef struct //线性表的动态分配顺序存储结构
{
DataType *elem;
int length;
int listsize;
}SepList;
int InitSepList(SepList *L) //构造一个空的线性表
{
L->elem=(DataType*)malloc((LIST_INSTSIZE+1)*sizeof(DataType));
if(!L->elem)
return 0;//返回空间不成功
L->length=0;
L->listsize=LIST_INSTSIZE;
return 1;
}
void one(SepList *L) //未输入线性表中的数据,功能1
{
int i,a; //定义a变量,代表数据个数,i是循环变量
printf("请先输入顺序表的数据个数,然后输入数据,完成1号功能。\n");
printf("数据个数为:");
scanf("%d",&a);
printf("开始输入数据,中间用空格隔开。");
for(i=1;i <=a;i++)

if(L->listsize-L->length <=0) //先判断空的线性表是否构造成功
{
L->elem=(DataType*)malloc((LIST_INSTSIZE+1)*sizeof(DataType)); 
if(!L->elem)
{printf("分配空间失败!\n");
exit(1);
}
L->listsize = 0;  //added by csdn for size初始化
L->listsize=L->listsize+LIST_INSTSIZE;
L->length = 0;  //added by csdn for length初始化

}
++L->length; //输入的同时计算表长
scanf( "%d", L->elem+L->length-1); //开始循环输入数,此时,表的长度为用户输入的数据个数,即L->length=a


}
getchar();
printf("如果想看你输入的线性表,请选择7号功能。\n");

}
void two(SepList *L) //插入数据到顺序表

DataType e, *newbase, *q,*p;
int i;
printf("请分别提供插入的数据位置和需要插入的数据,完成2号功能。\n");
printf("插入到第几号元素之后?");
scanf("%d",&i);
printf("\n插入的元素是:");
scanf("%d",&e);

if(i <1||i>L->length+1)
{ printf("插入的地方不合法。\n");
exit(1);} //i值不合法
if(L->length>=L->listsize)
{
newbase=(DataType *)realloc(L->elem,(L->listsize+LIST_INSTSIZE)*sizeof(DataType));
if(!newbase)
{ printf("分配空间失败。\n"); 
exit(1);}//分配空间失败
L->elem=newbase;
L->listsize+=LIST_INSTSIZE;
}
q=L->elem+i;  //modified by csdn q=&(L->elem[i-1])
for(p=L->elem+L->length-1;p>=q;--p) *(p+1)=*p;
*q=e;
++L->length;
printf("数据已经插入成功。\n");
}
void three(SepList *L) //删除线形表
{
int i;
DataType e,*p,*q;
printf("请提供删除的数据位置,完成3号功能。");
scanf("%d",&i);
if((i <1)||(i>L->length))
{printf("输入的数据无效。\n");
exit(1);} 
p=&(L->elem[i-1]);
e=*p;
q=L->elem+L->length -1;
for(++p;p <=q;++p)*(p-1)=*p;
--L->length;
printf("数据已经删除。\n");

}
void four(SepList *L) //求表长
{
printf("线形表为:");
printf("长度为:%d\n",L->length); //modified by csdn printf("L->length\n")
}
void five(SepList *L) //按值查找
{
DataType a; //要查找的数据
int i; //用来控制长度
DataType *p; 
printf("请输入要查找的数据:");
scanf("%d",&a);
printf("\n");
i=1; 
p=L->elem; //把首地址给p 
while(i <=L->length && *p++!=a) ++i; 
if(i <=L->length) 
{ printf("\n%d 在第%d个位置: \n",a,i); }//不超过长度的条件下找到 
else 
{printf("\n所给的数不在线形表的范围里面\n");} //超过长度即找不到 
 
}
void six(SepList *L) //读取元素的值
{
int i,a; //用户输入要查找的数据的位置,a用于计算
DataType *p; 
printf("请输入要查找多少号的数据:");
scanf("%d",&i);
printf("\n");
a=1;
p=L->elem; //把线形表的首地址给p
while(i!=a)
{a++;
p++;}
if(a <=L->length)
{
printf("%d 所对应线形表中的数是:%d\n",i,*p);
}
else
{
printf("找不到所对应的数。\n");
}


}
void serven(SepList *L) //显示输出线形表
{

int i; 
int n;
n=L->length;
i=0; 
printf("线形表是:\n"); 
DataType *p;  //added by csdn 保留首地址,输出完后使用
p=L->elem; //把线形表的首地址给p  //added by csdn 保留首地址,输出完后使用
for(i=0;i <n;i++) //循环输出
printf("%d ",*(L->elem++)); 
L->elem = p;  //added by csdn 保留首地址,输出完后使用
  printf("\n");
}
int eight(SepList *L) //退出功能
{
printf("你已经退出操作\n");
return 0;
}
void main()

int c,a; //定义变量c,代表用户所选择的功能
SepList mylist;
 
int InitSepList(SepList *L); //函数的声明
void one(SepList *L);
void two(SepList *L);
void three(SepList *L); 
void four(SepList *L);
void five(SepList *L); 
void six(SepList *L); 
void serven(SepList *L);
int eight(SepList *L);
printf("\n\n\n\n");
printf("\n\t\t\t********************************");
printf("\n\t\t\t* 1-------顺序表初始化 *");


printf("\n\t\t\t* 2-------插入 *");
printf("\n\t\t\t* 3-------删除 *");
printf("\n\t\t\t* 4-------求表长 *");
printf("\n\t\t\t* 5-------按值查找 *");
printf("\n\t\t\t* 6-------读取元素 *");
printf("\n\t\t\t* 7-------显示线性表 *");
printf("\n\t\t\t* 0-------退出 *");
printf("\n");
printf("请按照提示输入要执行的功能,如果之前没有顺序表,请先选择1号功能,\n完成顺序表的初始化。\n");
scanf("%d",&c);
if(c==1) //modified by csdn c=1要换成c==1
{
one(&mylist);
}

while(true)  //added by csdn 加了循环一直处理
{
printf("请继续输入要执行的功能:");
scanf("%d",&a);  //modified by csdn  a换成&a
switch(a)
{
case 2: two(&mylist);break;
case 3: three(&mylist);break;
case 4: four(&mylist);break;
case 5: five(&mylist);break;
case 6: six(&mylist);break;
case 7: serven(&mylist);break;
case 0: eight(&mylist);break;
}
if (a==0)
break;
}
}

热点排行