数据结构求助,急!

fengasha 2010-11-21 09:57:46
这是我编的一个顺序表,由于C语言得基础不牢,好多不会,代码有个大问题,希望高手指点,再提点关于编程的建议,不胜感激。
#include"stdio.h"
#include"malloc.h"
#include"conio.h"
#define maxsize 10
struct
{ char name[maxsize];
float num[maxsize];
float score[maxsize];
int last;
}sequenlist;

void InitList(sequenlist L) /*新建空链表*/
{ L -> last=0;
}


void CreatList(sequenlist L) /*初始化链表*/
{ int n,i;
int tmp1,tmp2;
char tmp3;
printf("请输入数据的个数:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{ printf("name[%d]=\n",i);
printf("num[%d]=\n",i);
printf("score[%d]=\n",i);
fflush(stdin);
scanf("%s",&tmp3);
scanf("%f",&tmp2);
scanf("%f",&tmp1);
L->name[i]=tmp3;
L->num[i]=tmp2;
L->score[i]=tmp1;
}
L->last=n-1;
printf("\n");
}


void ClearList(sequenlist L) /*清除链表*/
{
L->last=0;
}



int GetElem(sequenlist L,int i,sequenlist e) /*查找链表*/
{ int n;
n=L->last;
if(i==0)
return FALSE;
for(i=0;i<n;i++)
{ if((L.name[m]==e.name)&&(L.num[m]==e.num)&&(L.score[m]==e.score))
return(i);
}
else printf("找不到该值!\n");
return 0;
}


void PriorElem(sequenlist L,sequenlist cur_e,sequenlist pre_e) /*输出前驱*/
{
int i,j;
j=L->last;
if(j==0)
return 0;
for(i=1;i<j;i++)
{ if((L.name[i]==cur_e.name)&&(L.num[i]==cur_e.num)&&(L.score.[i]==cur_e.score))
pre_e.name=L.name[i-1];
pre_e.num=L.num[i-1];
pre_e.score=L.score[i-1];
printf("%s,%f,%f\n",pre_e.name,pre_e.num,pre_e.score);
else
printf("操作失败,pre_e无定义");
}

void NextElem(sequenlist L,sequenlist cur_e,sequenlist next_e) /*输出后继*/
{ int i,j;
j=L->last;
if(j==0)
return 0;
for (i=L->last;i>0;i--)
{ if((L.name[i]==cur_e.name)&&(L.num[i]==cur_e.num)&&(L.score.[i]==cur_e.score))
next_e.name=L.name[i+1];
next_e.num=L.num[i+1];
next_e.score=L.score[i+1];
printf("%s,%f,%f\n",next_e.name,next_e.num,next_e.score);
else
printf("操作失败,next_e无定义");
}

void ListInsert(sequenlist L,int i,sequenlist e) /*插入元素*/
{ int j;
if(L->last==maxsize-1)
{ printf("overflow");
return 0;
}
else if ((i<0)||(i>L-last))
{ printf("error,please input the ringht 'i'");
return 0;
}
else
for(j=L->last;j>=i;j--)
{ L->name[j+1]=L->name[j];
L-num[j+1]=L->num[j];
L->score[j+1]=L->score[j];
L->name[i]=e.name;
l->num[i]=e.num;
l->score[i]=e.score;
L-last=L->last+1;
} return (1);
}

void ListDelete(sequenlist L,int i,sequenlist e) /*删除元素*/
{ if ((i<0)||(i>L->last))
{ printf("error,please input the ringht 'i'");
return 0;
}
else
for (;i<L->last;i++)
{L->name[i]=L->name[i+1];
L->num[i]=L->num[i+1];
L->score[i]=L->score[i+1];
L->last=L->last-1;
e.name=l.name[i];
e.num=L.num[i];
e.score=L.score[i];
return e;
}
}

void printout(sequenlist L) /*输出链表*/
{ int i;
{ printf("***************name******************num***************score**************\n");
for(i=0;i<L->last;i++)
{printf(" %s %f %f ",L->name[i],L->num[i],L->score[i]);}
}

main()
{ sequenlist *L;
char cmd;
int m; struct X; int n;int k;
L=(sequenlist *)malloc(sizeof(sequenlist));
printf("\n****************************************************************************\n");
printf("\n***************************建立顺序表(C)************************************\n");
printf("\n***************************初始化顺序表(N)**********************************\n");
printf("\n***************************插入元素(I)**************************************\n");
printf("\n***************************输出前趋(O)**************************************\n");
printf("\n***************************输出后继(P)**************************************\n");
printf("\n***************************删除元素(D)**************************************\n");
printf("\n***************************按值查找(M)**************************************\n");
printf("\n***************************清除顺序表(Q)************************************\n");
printf("\n***************************输出顺序表(R)************************************\n");
printf("\n***************************退出系统(E)**************************************\n");
printf("\n****************************************************************************\n");
printf("\n作者:****\n");
do {
fflush(stdin);
scanf("%c",&cmd);
}
while((cmd!='C')&&(cmd!='N')&&(cmd!='I')&&(cmd!='O')&&(cmd!='p')&&(cmd!='D')&&(cmd!='M')&&(cmd!='Q')&&(cmd!='R')&&(cmd!='E'))
switch(cmd)
case 'C':
fflush(stdin);
InitList(L);break;
case 'N':
fflush(stdin);
CreatList(L);
printout(L);break;
case 'I':
printf("请输入你要插入的数据:\n");
fflush(stdin);
scanf("%s",&X.name);
scanf("%f",&X.num);
scanf("%f",&X.score);
printout(L);
printf("请输入你要插入的位置:");
scanf("%d",&m);
ListInsert(L,m,X);
printout(L);break;
case 'D':
printout(L);
printf("请输入你要删除数据的位置:\n");
fflush(stdin);
scanf("%d",&m);
ListDelete(L,m);
printout(L);break;
case 'O':
printf("请输入元素:");
scanf("%s",&X.name);
scanf("%f",&X.num);
scanf("%f",&X.score);
n=Getelem(L,m,X);
if(n!=0)
{ PriorElem(L,X,&pre_e);
else
printf("对不起,您输入的不是本线性表数据");}
case 'P':
printf("请输入元素:\n");
scanf("%s",&X.name);
scanf("%f",&X.num);
scanf("%f",&X.score);
n=Getelem(L,m,X);
if(n!=0)
{ GetElem(L,X,&pre_e);
else
printf("对不起,您输入的不是本线性表数据");
case 'D':
printout(L);
printf("请输入你要删除的位置:\n");
scanf("%d",&m);
pre_e=ListDelete(&L,i,e);
printf("删除数据元素为:%s,%f,%f\n",pre_e.name,pre_e.num,pre_e.score);
case 'M':
printf("请输入数据元素:");
scanf("%s",&X.name);
scanf("%f",&X.num);
scanf("%f",&X.score);
n=GetElem(L,n,X);
printf("该元素为第%d位",n);
case 'Q':
ClearList(&L);
printout(L);
case 'E':
clrscr(L);



}
...全文
201 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sea_spray 2010-11-30
  • 打赏
  • 举报
回复
楼主还是把调试出的问题给大家看看,这样的代码太多了。
smilewtt 2010-11-30
  • 打赏
  • 举报
回复
顶~~~~~~~~~~~~~
super_admi 2010-11-26
  • 打赏
  • 举报
回复
我想补充三点建议吧:
1.变量名的命名问题。这个问题是老生常谈的问题了。你应该去找本这方面的书看看。这个是直接影响到你的编程风格以及编程清晰度的问题。

2.C语言中数据和方法的组织。一般来说,用C语言的人,如果想要写内聚程度比较高的模块,最常见的方法,就是使用struct和函数指针,把数据和操作数据的方法整合起来,然后再约定一个初始化函数和销毁函数,就有点类似C++中的类了--当然,只是形似,没有继承和多态,只有封装。

3.对于这种底层的基础的东西,一般是不允许在模块内出现输入输出语句的。常见的办法是使用一个变量来接收要输入的东西,而使用另一个变量来输出想要输出的东西。在需要调用本模块的地方,再使用输入输出语句对这两个变量进行操作。
hnsdjava 2010-11-26
  • 打赏
  • 举报
回复
推荐 你搜下 林锐的 C++代码规范,写好一部分就编译下,把别的功能return 1;别写完再弄。。。
luciferisnotsatan 2010-11-25
  • 打赏
  • 举报
回复
代码好长,自己调一下
漫步者、 2010-11-25
  • 打赏
  • 举报
回复
代码好长啊,抓狂了!.....
让给LX!!
super_admi 2010-11-25
  • 打赏
  • 举报
回复
我感觉,你这个东西,不能叫链表。不管链表是用连续的数组来实现,还是用离散的节点来实现,但链表中的每个节点中,至少有一个指针是指向其它的某个节点的。

我感觉你这个节点就定义得很有问题。不但没有指针(数组则应该用一个int或者long类型指针,而离散节点,则应该用struct*指针。),数据存储的定义也很有问题。

至少我是看不懂你的东西的,或许是我见识太狭窄了,才疏学浅。
simpsonzia 2010-11-23
  • 打赏
  • 举报
回复
建议用插入源码的形式重新编辑一下,这样太乱,看不清。而且,我也是新手,数据结构知识很薄弱……
射下北极星 2010-11-23
  • 打赏
  • 举报
回复
自己单步调调看是哪儿出的问题,这么长。。。
aa1013911535 2010-11-23
  • 打赏
  • 举报
回复
//这是我编的一个顺序表,由于C语言得基础不牢,好多不会,代码有个大问题,希望高手指点,再提点关于编程的建议,不胜感激。
#include"stdio.h"
#include"malloc.h"
#include"conio.h"
#define maxsize 10
typedef struct
{ char name[maxsize];
float num[maxsize];
float score[maxsize];
int last;
}sequenlist;

void InitList(sequenlist L) /*新建空链表*/
{
L.last=0;
}


void CreatList(sequenlist L) /*初始化链表*/
{ int n,i;
float tmp1,tmp2;
char tmp3;
printf("请输入数据的个数:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{ printf("name[%d]=\n",i);
printf("num[%d]=\n",i);
printf("score[%d]=\n",i);
fflush(stdin);
scanf("%s",&tmp3);
scanf("%f",&tmp2);
scanf("%f",&tmp1);
L.name[i]=tmp3;
L.num[i]=tmp2;
L.score[i]=tmp1;
}
L.last=n-1;
printf("\n");
}


void ClearList(sequenlist L) /*清除链表*/
{
L.last=0;
}



int GetElem(sequenlist L,int i,sequenlist e) /*查找链表*/
{ int n;
n=L.last;
if(i==0)
return 0;
for(i=0;i<n;i++)
{ if((L.name[i]==e.name[0])&&(L.num[i]==e.num[0])&&(L.score[i]==e.score[
0]))
return(i);

else
printf("找不到该值!\n");
return 0;
}
}


int PriorElem(sequenlist L,sequenlist cur_e,sequenlist pre_e) /*输出前驱*/
{
int i,j;
j=L.last;
if(j==0)
return 0;
for(i=1;i<j;i++)
{

if( (L.name[i]==cur_e.name[0]) && (L.num[i]==cur_e.num[0]) && (L.score.[i]==cur_e.score[0]) )
{ pre_e.name=L.name[i-1];
pre_e.num[0]=L.num[i-1];
pre_e.score[0]=L.score[i-1];
printf("%s,%f,%f\n",pre_e.name,pre_e.num,pre_e.score);
}
else
printf("操作失败,pre_e无定义");
}

void NextElem(sequenlist L,sequenlist cur_e,sequenlist next_e) /*输出后继*/
{ int i,j;
j=L.last;
if(j==0)
return 0;
for (i=L.last;i>0;i--)
{ if((L.name[i]==cur_e.name)&&(L.num[i]==cur_e.num)&&(L.score.[i]==cur_e.score))
next_e.name=L.name[i+1];
next_e.num=L.num[i+1];
next_e.score=L.score[i+1];
printf("%s,%f,%f\n",next_e.name,next_e.num,next_e.score);
else
printf("操作失败,next_e无定义");
}

void ListInsert(sequenlist L,int i,sequenlist e) /*插入元素*/
{ int j;
if(L->last==maxsize-1)
{ printf("overflow");
return 0;
}
else if ((i<0)||(i>L-last))
{ printf("error,please input the ringht 'i'");
return 0;
}
else
for(j=L->last;j>=i;j--)
{ L->name[j+1]=L->name[j];
L-num[j+1]=L->num[j];
L->score[j+1]=L->score[j];
L->name[i]=e.name;
l->num[i]=e.num;
l->score[i]=e.score;
L-last=L->last+1;
} return (1);
}

void ListDelete(sequenlist L,int i,sequenlist e) /*删除元素*/
{ if ((i<0)||(i>L->last))
{ printf("error,please input the ringht 'i'");
return 0;
}
else
for (;i<L->last;i++)
{L->name[i]=L->name[i+1];
L->num[i]=L->num[i+1];
L->score[i]=L->score[i+1];
L->last=L->last-1;
e.name=l.name[i];
e.num=L.num[i];
e.score=L.score[i];
return e;
}
}

void printout(sequenlist L) /*输出链表*/
{ int i;
{ printf("***************name******************num***************score**************\n");
for(i=0;i<L->last;i++)
{printf(" %s %f %f ",L->name[i],L->num[i],L->score[i]);}
}

main()
{ sequenlist *L;
char cmd;
int m; struct X; int n;int k;
L=(sequenlist *)malloc(sizeof(sequenlist));
printf("\n****************************************************************************\n");
printf("\n***************************建立顺序表(C)************************************\n");
printf("\n***************************初始化顺序表(N)**********************************\n");
printf("\n***************************插入元素(I)**************************************\n");
printf("\n***************************输出前趋(O)**************************************\n");
printf("\n***************************输出后继(P)**************************************\n");
printf("\n***************************删除元素(D)**************************************\n");
printf("\n***************************按值查找(M)**************************************\n");
printf("\n***************************清除顺序表(Q)************************************\n");
printf("\n***************************输出顺序表(R)************************************\n");
printf("\n***************************退出系统(E)**************************************\n");
printf("\n****************************************************************************\n");
printf("\n作者:****\n");
do {
fflush(stdin);
scanf("%c",&cmd);
}
while((cmd!='C')&&(cmd!='N')&&(cmd!='I')&&(cmd!='O')&&(cmd!='p')&&(cmd!='D')&&(cmd!='M')&&(cmd!='Q')&&(cmd!='R')&&(cmd!='E'))
switch(cmd)
case 'C':
fflush(stdin);
InitList(L);break;
case 'N':
fflush(stdin);
CreatList(L);
printout(L);break;
case 'I':
printf("请输入你要插入的数据:\n");
fflush(stdin);
scanf("%s",&X.name);
scanf("%f",&X.num);
scanf("%f",&X.score);
printout(L);
printf("请输入你要插入的位置:");
scanf("%d",&m);
ListInsert(L,m,X);
printout(L);break;
case 'D':
printout(L);
printf("请输入你要删除数据的位置:\n");
fflush(stdin);
scanf("%d",&m);
ListDelete(L,m);
printout(L);break;
case 'O':
printf("请输入元素:");
scanf("%s",&X.name);
scanf("%f",&X.num);
scanf("%f",&X.score);
n=Getelem(L,m,X);
if(n!=0)
{ PriorElem(L,X,&pre_e);
else
printf("对不起,您输入的不是本线性表数据");}
case 'P':
printf("请输入元素:\n");
scanf("%s",&X.name);
scanf("%f",&X.num);
scanf("%f",&X.score);
n=Getelem(L,m,X);
if(n!=0)
{ GetElem(L,X,&pre_e);
else
printf("对不起,您输入的不是本线性表数据");
case 'D':
printout(L);
printf("请输入你要删除的位置:\n");
scanf("%d",&m);
pre_e=ListDelete(&L,i,e);
printf("删除数据元素为:%s,%f,%f\n",pre_e.name,pre_e.num,pre_e.score);
case 'M':
printf("请输入数据元素:");
scanf("%s",&X.name);
scanf("%f",&X.num);
scanf("%f",&X.score);
n=GetElem(L,n,X);
printf("该元素为第%d位",n);
case 'Q':
ClearList(&L);
printout(L);
case 'E':
clrscr(L);
改了一些,看看,
fengfeixue123 2010-11-23
  • 打赏
  • 举报
回复
编码风格太乱,还有,对函数参数的几种传递方式没弄清楚,有待提高,呵呵!
时间一粒 2010-11-23
  • 打赏
  • 举报
回复
有问题也要帖出来,或者提示哪里错了,不然,别人看得头疼
kingbigeast 2010-11-21
  • 打赏
  • 举报
回复
好长。。。

33,317

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧