#include<stdio.h>
#include <stdlib.h>
#include<string.h>
typedef char ElemType[20];
#define LIST_INIT_SIZE 100 //線性表存盤空間的初始分配
#define LISTINCREMENT 10 //線性表存盤空間的分配增量
typedef struct
{
ElemType *elem; //存盤空間基址
int length; //當前長度
int listsize; //當前分配的存盤容量(以sizeof(ElemType)為單位)
} SqList;
/* 你的程式將嵌在這里 */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
/* 你的程式將嵌在這里 */
Status InitList_Sq(SqList &L)
{
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(L.elem)
return ERROR;
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
Status ListInsert_Sq(SqList &L,int i,ElemType e)
{
ElemType *p,*q,*newbase;
if(i<1||i>L.length+1)
return ERROR;//i不合法
if(L.length>=L.listsize)//當前存盤空間已滿
{
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW); //存盤分配失敗
L.elem=newbase;//新基址
L.listsize+=LISTINCREMENT;
}
q=&(L.elem[i-1]);//q為插入位置;
//if(L.length>=1)
for(p=&(L.elem[L.length-1]); p>=q; --p) //p是最后一個位置
strcpy(*(p+1),*p);//元素后移
strcpy(*q,e);//插入e
++L.length;//表長增加;
return OK;
}
Status ListLength_Sq(SqList L)
{
return L.length;
return OK;
}
Status GetElem_Sq(SqList L,int i,ElemType e)
{
if(i<1||i>L.length+1)
return ERROR;
e=L.elem[i-1];
return OK;
}
Status DestroyList_Sq(SqList L)//銷毀線性表
{
free(L.elem);
L.elem=NULL;
L.length=0;
L.listsize=0;
return OK;
}
void chaji_Sq(SqList La,SqList Lb,SqList &Lc)
{
ElemType ai,bj;
int La_len,Lb_len;
int k=0;
La_len=ListLength_Sq(La);
Lb_len=ListLength_Sq(Lb);
//int Lc.length=0;
int i,j;
for(i=1; i<=La_len; i++)
{
for(j=1; j<=Lb_len; j++)
{
if(GetElem_Sq(La,i,ai)!=GetElem_Sq(Lb,j,bj))
{
ListInsert_Sq(Lc,++k,ai);
}
}
}
}
int main()
{
int i,j,len;
ElemType e;
SqList La,Lb,Lc;
int m,n; //分別存放兩個集合初始長度
printf("input the length of two set:\n");
scanf("%d%d",&m,&n);
InitList_Sq(La);
InitList_Sq(Lb); //建立兩個空集
printf("input the first set:\n ");
for(i=0; i<m; i++) //建立第一個集合
{
scanf(" %s",e); //注意有空格
ListInsert_Sq(La,i+1,e);
}
printf("input the second set:\n ");
for(i=1; i<=n; i++) //建立第二個集合
{
scanf(" %s",e); //注意有空格
ListInsert_Sq(Lb,i,e);
}
chaji_Sq(La,Lb,Lc); //計算集合La、Lb的差集Lc
printf("the chaji set is:\n");
len=ListLength_Sq(Lc);
for(i=1; i<=len; i++)
{
GetElem_Sq(Lc,i,e);
printf("%s\n",e);
}
DestroyList_Sq(La);
DestroyList_Sq(Lb);
DestroyList_Sq(Lc); //銷毀3個集合(順序表)
return 0;
}
uj5u.com熱心網友回復:
首先GetElem_Sq的e=L.elem[i-1]有問題,你既然知道Insert_Sq時用strcpy來處理,為啥這里又不會用strcpy了?e=L.elem[i-1]是傳不出函式外,要用strcpy(e, L.elem[i-1])。其次,chaji_Sq的邏輯有問題,對比一下以下邏輯吧
for(i=1; i<=La_len; i++) {
GetElem_Sq(La, i, ai);
flag = 0;
for(j=1; j<=Lb_len; j++) { //判斷ai在Lb是否存在
GetElem_Sq(Lb, j, bj);
if(strcmp(ai, bj)==0) { //字串比較
flag=1; //如果有相同元素
break; //就退出查找
}
}
if(flag==0) { //如果沒有相同元素
Insert_Sq(Lc, ++k, ai); //加入差集
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/8163.html
標籤:新手樂園
上一篇:隱藏游標的問題
下一篇:函式宣告和鏈接的問題
