你提到的“奇怪错误”是由于你的exit宏和函数重名了,所以预处理器会把程序中的exit用-1代替,所以出错。
创新互联长期为上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为将乐企业提供专业的网站设计、成都做网站,将乐网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。
另外,你的合并函数也是错误的,无法达到要求,整个程序修改如下:
//---------------------------------------------------------------------------
#include stdio.h
#include stdlib.h //注意这里,exit()函数要用到这个文件,这个文件已经包含了malloc()等函数的声明
#define OK 1
#define LIST_INIT_SIZE 100
#define OVERFLOW 0
#define EXIT -2 //************注意这里
typedef int ElemType;
typedef int Status;
typedef struct {
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList_Sq(SqList *L)
{ L-elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L-elem) exit(OVERFLOW);
L-length=0;
L-listsize=LIST_INIT_SIZE;
return OK;
}
void Create_Sq(SqList *L)
{ int i,n;
printf("创建一个有序表:\n");
printf("输入有序表中元素的个数:");
scanf("%d",n);
L-length=n;
for(i=0;in;i++){
printf("输入第%d个元素的值:",i+1);
scanf("%d",L-elem[i]);
printf("\n");
}
}
void Disp_Sq(SqList *L) //************注意这里
{ int i,n;
n=L-length;
for(i=0;in;i++)
printf("%5d",L-elem[i]);
printf("\n");
}
void Combine(SqList *la,SqList *lb) //************注意这里,此函数被重新编写
{
ElemType *pa=la-elem,*pb=lb-elem ;
int i,j,k,len_a=la-length,len_b=lb-length;
if ((la-elem=malloc((len_a+len_b)*sizeof(ElemType)))==NULL) exit(OVERFLOW);
for (k=i=j=0; ilen_ajlen_b; ) {
if (pa[i]pb[j]) la-elem[k++]=pa[i++];
else la-elem[k++]=pb[j++];
}
while (ilen_a)
la-elem[k++]=pa[i++];
while (jlen_b)
la-elem[k++]=pb[j++];
la-length=k;
la-listsize=k;
free(pa);
}
void main()
{SqList L1,L2;
InitList_Sq(L1);
InitList_Sq(L2);
Create_Sq(L1);
Disp_Sq(L1);
printf("\n");
Create_Sq(L2);
Disp_Sq(L2); //************注意这里
printf("\n");
Combine(L1,L2);
Disp_Sq(L1); //************注意这里
}
//---------------------------------------------------------------------------
定义一个成员结构体。
再定义此结构体的两个数组,数组大小是csv文件中存储的成员数。
使用fscanf函数读取A.csv的数据存入一个结构体数组中,读取B.csv的数据存入另一个结构体数组中。
循环遍历结构体数组,把一个数组的元素值赋值给另一个数组的元素。这样另一个结构体数组就有了两个csv文件中的数据。
使用fopen函数创建并打开C.csv文件。
把数据完整的另一个结构体数组的数据使用fprintf函数输出到C.csv文件中。
注释的部分是采用数组实现的,未注释的是采用链表实现的,可以将链表实现的注释起来和数组实现的运行做对比
#include "stdio.h"
#include "stdlib.h"
/*采用数组实现
int merge(int* a,int* b,int*c,int alen,int blen)
{
int i=0,j=0,k=0;
//每次将a和b中当前的元素进行比较,并将小的一个存入到c中
while(ialen jblen)
{
if(a[i]b[j])
c[k]=a[i++];
else c[k]=b[j++];
k++;
}
//其中一个数组已经结束,将另一个数组剩余部分全部复制到c即可
while(ialen)
c[k++]=a[i++];
while(jblen)
c[k++]=b[j++];
return k;//返回值为c的有效长度
}
void main()
{
int a[]={1,3,5,7,9,10,12,14};
int b[]={2,4,6,8,10,11,12,13};
int c[100];
int i,clen;
clen=merge(a,b,c,sizeof(a)/sizeof(*a),sizeof(b)/sizeof(*b));
for(i=0;iclen;i++)
printf("%d ",c[i]);
printf("\n");
}
*/
struct Node
{
int value;
struct Node* next;
};
struct LinkList
{
struct Node* head;
};
//将数组a赋值给链表list
void setLinkList(int* a,int alen,struct LinkList* list)
{
int i;
struct Node* p,*temp;
list-head=(struct Node*)malloc(sizeof(struct Node));
p=list-head;
for(i=0;ialen;i++)
{
p-value=a[i];
p-next=(struct Node*)malloc(sizeof(struct Node));
temp=p;
p=p-next;
}
free(p);
temp-next=NULL;//尾指针赋NULL
}
void mergeLinkList(struct LinkList* a,struct LinkList* b,struct LinkList* c)
{
struct Node *p=a-head,*q=b-head,*r,*temp;
c-head=(struct Node*)malloc(sizeof(struct Node));
r=c-head;
while(p!=NULL q!=NULL)
{
if(p-valueq-value)
{
r-value=p-value;
p=p-next;
}
else
{
r-value=q-value;
q=q-next;
}
r-next=(struct Node*)malloc(sizeof(struct Node));
temp=r;
r=r-next;
}
while(p!=NULL)
{
r-value=p-value;
p=p-next;
r-next=(struct Node*)malloc(sizeof(struct Node));
temp=r;
r=r-next;
}
while(q!=NULL)
{
r-value=q-value;
q=q-next;
r-next=(struct Node*)malloc(sizeof(struct Node));
temp=r;
r=r-next;
}
free(r);
temp-next=NULL;
}
#define MAX_LEN 1000
void main()
{
int a[MAX_LEN];//={1,3,5,7,9,10,12,14};
int b[MAX_LEN];//={2,4,6,8,10,11,12,13};
int alen,blen,i;
struct LinkList alist,blist,clist;
struct Node* p;
printf("Please input the length of a : ");
scanf("%d",alen);
fflush(stdin);
printf("Please input %d number and separate them with space :\n",alen);
for(i=0;ialen;i++)
scanf("%d",a+i);
fflush(stdin);//这句很有必要,当输入的数据超过alen时,后面的数据将被忽略
printf("Please input the length of b : ");
scanf("%d",blen);
fflush(stdin);
printf("Please input %d number and separate them with space :\n",blen);
for(i=0;iblen;i++)
scanf("%d",b+i);
fflush(stdin);
setLinkList(a,alen,alist);
setLinkList(b,blen,blist);
mergeLinkList(alist,blist,clist);
p=clist.head;
printf("The result is :\n");
while(p!=NULL)
{
printf("%d ",p-value);
p=p-next;
}
printf("\n");
}
1、c语言是没有引用的,可以使用一个const指针来模拟引用void InitList(SqList *L){L-last=0;}。
2、这个是顺序表的初始化,不用管int LenList(SqList L){return L.last;}。
3、插入操作,这一步是关键,插入顺序表int InsertList(SqList *L,int i,ElemType x){int k;if(L-last=MAX){printf("表已满,无法插入\n");return 0}else if(i0 || iL-last+1){printf("插入位置不合法\n");return 0;}。
4、这是接着上面的第二步,判断的else{for(k=L-last;ki-1;k--)L-elem[k]=L-elem[k-1];L-elem[i-1]=x;L-last++;return 0;}。
5、canf(%d",a) 是读取整型变量a在内存中的地址,而scanf("%d",a)是读取整型变量a的值。就完成了。