线性表的顺序存储

//功能描述:
//1.初始化顺序表
//2.在位置1插入数据99,在位置2插入数据66,在位置3插入数据33,并打印出顺序表;
//3.删除第2个元素,并打印出顺序表;
//4、查找元素66是否存在,若存在输出其索引
//5、追加
//练习:1.线性表的并集(将表A\B中的数据合并在表A中)
//2.线性表的合并(将A、B表中的数据合并在C中,保留重复项)

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int ElementType;
typedef struct{
ElementType Data[MAXSIZE];
int Last;
}List;
List *MakeEmpty()
{
List *PtrL;
PtrL=(List*)malloc(sizeof(List));
PtrL->Last=-1;
return PtrL;

}
int Find(ElementType X,List*PtrL)
{
int i=0;
while(i<PtrL->Last&&PtrL->Data[i]!=X)
i++;
if(i>PtrL->Last)
return -1;
else
return i;

}
void Insert(ElementType X,int i,List*PtrL)
{
int j;
if(PtrL->Last==MAXSIZE-1)
{
printf("表满");
return;
}
if(i<1||i>PtrL->Last+2)
{
printf("位置不合法");
return;
}
for(j=PtrL->Last;j>=i-1;j--)
PtrL->Data[j+1]=PtrL->Data[j];
PtrL->Data[i-1]=X;
PtrL->Last++;
return ;
}
void Delete(int i,List*PtrL)
{
int j;
if(i<1||i>PtrL->Last+1) /*检查空表以及删除的位置的合法性*/
{
printf("删除的位置不合法");
return;
}
for(j=i;j<=PtrL->Last;j++)
PtrL->Data[j-1]=PtrL->Data[j];
PtrL->Last--;
return;
}
void Append(ElementType item,List*PtrL)
{
if(PtrL->Last<MAXSIZE-1)
PtrL->Data[++PtrL->Last]=item;
return;
}
List * Merge(List*A,List*B,List*C)
{
int i=0;                         问题二:在写这一块的代码时没有初始化i、j的值,以至于出现乱码。无论在循环语句还是条件语句数组的具体下标一定要明确
int j=0;
while(i<A->Last+1&&j<B->Last+1)
{
if(A->Data[i]<B->Data[j])
{
Append(A->Data[i],C);
i++;
}
else
{
Append(B->Data[j],C);
j++;
}

}
while(i<A->Last+1) /*如果A没走完,将A剩余的追加到C*/
{
Append(A->Data[i],C);
i++;
}
while(j<B->Last+1)
{
Append(B->Data[j],C);
j++;
}
return C;
}
List *Union(List*A,List*B)
{
int i,j;
for(i=0;i<B->Last+1;i++)/*外层循坏是集合B*/

{
for(j=0;j<A->Last+1;j++)/*内层循坏是集合A*/
{
if(B->Data[i]==A->Data[j])
{
Delete(i+1,B);
}
}
Append(B->Data[i],A);      问题一:对于双重循环如果要执行的语句摆放的位置不正确,易导致循坏输出。因此在写双重循环时一定要想好要实现的结果。
}
return A;
}
void print(List*A)
{
int i;
for(i=0;i<A->Last+1;i++)
printf("%5d\n",A->Data[i]);
}
int main()
{
List*A,*B,*C;
printf("在表A里插入元素\n");
A=MakeEmpty();
Insert(6,1,A);
Insert(8,2,A);
Insert(3,3,A);
Insert(11,4,A);
Append(34,A);
print(A);
/*printf("删除表A里的第二个元素\n");
Delete(2,A);
print(A);*/
printf("表B里的元素\n");
B=MakeEmpty();
Insert(8,1,B);
Insert(4,2,B);
Insert(11,3,B);
Insert(33 ,4,B);
print(B);
printf("求AB的合并\n");
C=MakeEmpty();
Merge(A,B,C);
print(C);
printf("求AB的并集\n");
Union(A,B);
print(A);
return 0;
}

posted @ 2016-09-19 11:23  Undo  阅读(128)  评论(0编辑  收藏  举报