关于线性表的超级菜鸟有关问题
关于线性表的超级初学者问题
#include <stdio.h>
#include <stdlib.h>
#include"malloc.h"
#define list_init_size 10000
#define LISTINCREMENT 10
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
int last;
}sqlist;
int initlist_sq(sqlist &l){ //建立空的线性表
l.elem=(int * )malloc(list_init_size*sizeof(int));
if(!l.elem)return 0;
l.length=0;
l.listsize=list_init_size;
return 1;
}
int merge(sqlist A,sqlist B,sqlist *c) //把A,B表放入表中并保持有序
{int i,j,k;
i=0;j=0;k=0; //记数
while ( i<=A.last &&j<=B.last)
if (A.elem[i]<B.elem[j])
c->elem[k++] = A.elem[i++];
else
c->elem[k++] = B.elem[i++];
while (i<=A.last)
c->elem[k++] = A.elem[i++];
while (j<=B.last)
c->elem[k++]=B.elem[j++];
c->last=k-1;
return 1;
}
void main()
{sqlist l,m,n; //创造三个线性表l,m,n
int e=0;
initlist_sq(l);
initlist_sq(m);
printf("请输入线性表1长度:");
scanf("%d",&l.length);
printf("请输入所需的数据:");
for(int j=0;j<l.length;j++)
scanf("%d",&l.elem[j]);
printf("请输入线性表2长度:");
scanf("%d",&m.length);
printf("请输入所需的数据:");
for(int k=0;k<l.length;k++)
scanf("%d",&m.elem[k]);
merge(l,m,&n); //这样调用是否正确???
for(int q=0;q<l.length+m.length;q++)
printf("%d ",n.elem[q]);
}
执行程序并执行到输入线性表2的数据时出现主函数错误,不知道是什么错误,麻烦大虾们指点下`~
PS:小弟刚刚学数据结构,很多东西都不太清楚
------解决方案--------------------
/*错误很多,看来你编程缺乏耐心,这是我改后的程序,你看看吧,c++编译才能运行!!!*/
#include <stdio.h >
#include <stdlib.h >
#include"malloc.h"
#define list_init_size 10000
#define LISTINCREMENT 10
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
int last;
}sqlist;
int initlist_sq(sqlist &l){ //建立空的线性表
l.elem=(int * )malloc(list_init_size*sizeof(int));
if(!l.elem)return 0;
l.length=0;
l.listsize=list_init_size;
return 1;
}
//我把n当成函数返回值给传回去的,你也可以不要返回值,把n定义成全局的变量
sqlist merge(sqlist A,sqlist B,sqlist *c) //把A,B表放入表中并保持有序
{
int i,j,k;
i=0;j=0;k=0; //记数
while ( i <A.length &&j <B.length) //你这里用的A.last都没初始化就用,length和last值相同没必要记录两次
if (A.elem[i] <B.elem[j])
c->elem[k++] = A.elem[i++];
else
c->elem[k++] = B.elem[j++]; //用j记录B表,原来的程序你用的是i表示的,马虎!!!
while (i <A.length) //last我都改成length了
c->elem[k++] = A.elem[i++];
while (j <B.length)
c->elem[k++]=B.elem[j++];
c->last=k-1;
return *c;
}
int main()
{
//你在这定义的n它是局部的,上面的函数对他不可见,要么把它定义成全局的,要么把它当成函数返回值,否则你白忙活
sqlist l,m,n; //创造三个线性表l,m,n
int e=0;
initlist_sq(l);
initlist_sq(m);
initlist_sq(n);
printf("请输入线性表1长度:");
scanf("%d",&l.length);
printf("请输入所需的数据:");
for(int j=0;j <l.length;j++)
scanf("%d",&l.elem[j]);
printf("请输入线性表2长度:");
scanf("%d",&m.length);
printf("请输入所需的数据:");
#include <stdio.h>
#include <stdlib.h>
#include"malloc.h"
#define list_init_size 10000
#define LISTINCREMENT 10
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
int last;
}sqlist;
int initlist_sq(sqlist &l){ //建立空的线性表
l.elem=(int * )malloc(list_init_size*sizeof(int));
if(!l.elem)return 0;
l.length=0;
l.listsize=list_init_size;
return 1;
}
int merge(sqlist A,sqlist B,sqlist *c) //把A,B表放入表中并保持有序
{int i,j,k;
i=0;j=0;k=0; //记数
while ( i<=A.last &&j<=B.last)
if (A.elem[i]<B.elem[j])
c->elem[k++] = A.elem[i++];
else
c->elem[k++] = B.elem[i++];
while (i<=A.last)
c->elem[k++] = A.elem[i++];
while (j<=B.last)
c->elem[k++]=B.elem[j++];
c->last=k-1;
return 1;
}
void main()
{sqlist l,m,n; //创造三个线性表l,m,n
int e=0;
initlist_sq(l);
initlist_sq(m);
printf("请输入线性表1长度:");
scanf("%d",&l.length);
printf("请输入所需的数据:");
for(int j=0;j<l.length;j++)
scanf("%d",&l.elem[j]);
printf("请输入线性表2长度:");
scanf("%d",&m.length);
printf("请输入所需的数据:");
for(int k=0;k<l.length;k++)
scanf("%d",&m.elem[k]);
merge(l,m,&n); //这样调用是否正确???
for(int q=0;q<l.length+m.length;q++)
printf("%d ",n.elem[q]);
}
执行程序并执行到输入线性表2的数据时出现主函数错误,不知道是什么错误,麻烦大虾们指点下`~
PS:小弟刚刚学数据结构,很多东西都不太清楚
------解决方案--------------------
/*错误很多,看来你编程缺乏耐心,这是我改后的程序,你看看吧,c++编译才能运行!!!*/
#include <stdio.h >
#include <stdlib.h >
#include"malloc.h"
#define list_init_size 10000
#define LISTINCREMENT 10
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
int last;
}sqlist;
int initlist_sq(sqlist &l){ //建立空的线性表
l.elem=(int * )malloc(list_init_size*sizeof(int));
if(!l.elem)return 0;
l.length=0;
l.listsize=list_init_size;
return 1;
}
//我把n当成函数返回值给传回去的,你也可以不要返回值,把n定义成全局的变量
sqlist merge(sqlist A,sqlist B,sqlist *c) //把A,B表放入表中并保持有序
{
int i,j,k;
i=0;j=0;k=0; //记数
while ( i <A.length &&j <B.length) //你这里用的A.last都没初始化就用,length和last值相同没必要记录两次
if (A.elem[i] <B.elem[j])
c->elem[k++] = A.elem[i++];
else
c->elem[k++] = B.elem[j++]; //用j记录B表,原来的程序你用的是i表示的,马虎!!!
while (i <A.length) //last我都改成length了
c->elem[k++] = A.elem[i++];
while (j <B.length)
c->elem[k++]=B.elem[j++];
c->last=k-1;
return *c;
}
int main()
{
//你在这定义的n它是局部的,上面的函数对他不可见,要么把它定义成全局的,要么把它当成函数返回值,否则你白忙活
sqlist l,m,n; //创造三个线性表l,m,n
int e=0;
initlist_sq(l);
initlist_sq(m);
initlist_sq(n);
printf("请输入线性表1长度:");
scanf("%d",&l.length);
printf("请输入所需的数据:");
for(int j=0;j <l.length;j++)
scanf("%d",&l.elem[j]);
printf("请输入线性表2长度:");
scanf("%d",&m.length);
printf("请输入所需的数据:");