一、实现要求
(1)求顺序表中第i个元素(函数),若不存在,报错。
(2)在第i个结点前插入值为x的结点。
(3)删除顺序表中第i个元素结点。
(4)在一个递增有序的顺序表L中插入一个值为x的元素,并保持其递增有序特性。
(5)将顺序表L中的奇数项和偶数项结点分解开(元素值为奇数、偶数),分别放入新的顺序表中,然后原表和新表元素同时输出到屏幕上,以便对照求解结果。
(6)求两个递增有序顺序表L1和L2中的公共元素,放入新的顺序表L3中。
(7)删除递增有序顺序表中的重复元素,并统计移动元素次数,要求时间性能最好。
二、数据结构设计
定义顺序表:
typedef struct sList
{
elementType data[MAXLEN];
int len; //有效长度
} seqList;
三、代码实现
#ifndef _SEQLIST_h_
#define _SEQLIST_h_
#include <stdio.h>
#define MAXLEN 100
typedef int elementType ;
typedef struct sList
{
elementType data[MAXLEN];
int len; //有效长度
} seqList;
//初始化顺序表
void initList( seqList * L)
{
L->len =0;
}
//1.求顺序表中第i个元素,存在返回1,否则返回0
int getElement(seqList L,int i,elementType * x)
{
if(i<1 || i>L.len)
{
printf("元素位置越界!\n");
return 0;
}
else{
*x=L.data[i-1];
return 1;
}
}
//2.在第i个结点前插入值为x的结点。
int listInsert(seqList * L, int i,elementType x)
{
int j;
if(i==MAXLEN)
{
printf("溢出\n");
return 0;
}
else if(i<1 || i>L->len+1)
{
printf("序号超出范围,请重新输入\n");
return 0;
}
else{
for(j=L->len-1;j>=i-1;j--)
{
L->data[j+1]=L->data[j];
}
L->data[i-1]=x;
L->len++; //修改表的长度
return 1;
}
}
//3.删除顺序表中第i个元素结点。
int deleteKnot(seqList * L,int i)
{
int j;
if(L->len<=0)
{
printf("原表为空\n");
return 0;
}
else if(i<1 || i>L->len)
{
printf("删除位置不在有效范围!\n");
return 0;
}
else{
for(j=i;j<L->len;j++)
{
L->data[i-1]=L->data[i];
}
L->len--; //修改表的长度
return 1;
}
}
//4.在一个递增有序的顺序表L中插入一个值为x的元素,并保持其递增有序特性。
void insertOrderList(seqList * L,int x)
{
int i=0;
if(L->len==MAXLEN)
{
printf("链表已满,不能插入!\n");
return;
}
while(L->data[i]<=x)
{
if(i==L->len)
{
break;
}
else{
i++;
}
}
listInsert(L,i+1,x);
}
//遍历顺序表
void print(seqList * L)
{
int i;
for (i=0;i<L->len;++i)
{
printf("%d ",L->data[i]);
}
printf("\n");
}
//5.将顺序表L中的奇数项和偶数项结点分解开(元素值为奇数、偶数),分别放入新的顺序表中,然后原表和新表元素同时输出到屏幕上,以便对照求解结果。
void analyzeList(seqList * L,seqList * L1,seqList * L2)
{
int k=0,i=0,j=0;
for(i=0;i<L->len;++i)
{
if(L->data[i]%2==0)
{
while(j!=L->len)
{
L1->data[j]=L->data[i];
L1->len++;
j++;
break;
}
}
else{
while(k!=L->len)
{
L2->data[k]=L->data[i];
L2->len++;
k++;
break;
}
}
}
}
//6.求两个递增有序顺序表L1和L2中的公共元素,放入新的顺序表L3中。
void commonList(seqList * L1,seqList * L2,seqList * L3)
{
int i=0,p=0,q=0; //p,q指针分别指向L1,L2
while(p!=L1->len&&q!=L2->len)
{
if(L1->data[p]==L2->data[q])
{
while(i!=L1->len)
{
L3->data[i]=L1->data[p];
L3->len++;
break;
}
i++;
p++;
q++;
}
else if(L1->data[p]<L2->data[q])
{
p++;
}
else{
q++;
}
}
}
//7.删除递增有序顺序表中的重复元素,并统计移动元素次数
void deleteReaptElement(seqList * L)
{
int cou=0,i=0,j=1;
while(j!=L->len)
{
if(L->data[i]==L->data[j])
{
j++;
}
else{
L->data[i+1]=L->data[j];
i+=1;
cou++;
}
}
L->len=i+1; //修改顺序表L的长度
printf("移动元素次数为:%d ",cou);
}
void scan(seqList * L)
{
int i=1;
scanf("%d",&i);
while(i!=-1)
{
L->data[L->len]=i;
L->len++;
scanf("%d",&i);
}
}
#endif // _SEQLIST_h_
#include <stdio.h>
#include <stdlib.h>
#include "seqList.h"
int main()
{
int j,i=100;
int x;
seqList L,L1,L2,L3;
initList(&L);
initList(& L1);
initList(& L2);
initList(& L3);
while(i!=-1)
{
printf("******************************************************************************\n");
printf("按0退出程序\n");
printf("按1插入元素\n");
printf("按2获取第i个元素\n");
printf("按3删除第i个位置元素\n");
printf("按4在一个递增有序的顺序表L中插入一个值为x的元素,并保持其递增有序特性。\n");
printf("按5将顺序表L中的奇数项和偶数项结点分解开\n");
printf("按6求两个递增有序顺序表L1和L2中的公共元素,放入新的顺序表L3中\n");
printf("按7删除递增有序顺序表中的重复元素,并统计移动元素次数\n");
printf("按8创建链表\n");
printf("*******************************************************************************\n");
scanf("%d",&i);
switch(i)
{
case 0:
exit(1) ;
case 1:
printf("请输入插入位置:");
scanf("%d",&j);
printf("请输入插入元素:");
scanf("%d",&x);
if(!listInsert(&L, j,x))
{
}
else{
printf("插入元素元素后的链表L为:");
print(&L);
}
break;
case 2:
printf("请输入元素位置:");
scanf("%d",&j);
if(!getElement(L,j,&x))
{
}
else{
printf("第%d个位置元素为:%d\n",j,x);
}
break;
case 3:
printf("请输入删除元素位置:");
scanf("%d",&j);
if(!deleteKnot(&L,j))
{
}
else{
printf("删除元素元素后的链表L为:");
print(&L);
}
break;
case 4:
initList(& L);
printf("输入-1结束,");
printf("请输入顺序表L数据:\n");
scan(& L);
printf("表L为:");
print(&L);
printf("请输入插入的元素:");
scanf("%d",&x);
insertOrderList(&L,x);
printf("插入元素后顺序表为:");
print(&L);
initList( & L);
break;
case 5:
initList(& L);
initList(& L1);
initList(& L2);
printf("输入-1结束\n");
printf("请输入顺序表L数据:\n");
scan(& L);
printf("表L为:");
print(&L);
analyzeList(&L,&L1,&L2);
printf("表L1为:");
print(&L1);
printf("表L2为:");
print(&L2);
initList( & L);
break;
case 6:
initList(& L1);
initList(& L2);
initList(& L3);
printf("输入-1结束,");
printf("请输入顺序表L1数据\n");
scan(& L1);
printf("表L1为:");
print(&L1);
printf("输入-1结束,");
printf("请输入顺序表L2数据\n");
scan(& L2);
printf("表L2为:");
print(&L2);
commonList(&L1,&L2,&L3);
printf("表L3为:");
print(&L3);
break;
case 7:
printf("输入-1结束,");
printf("请输入递增有序顺序表L数据\n");
scan(& L);
printf("表L为:");
print(&L);
deleteReaptElement(&L);
printf("删除重复元素后顺序表L数据为:");
print(&L);
initList( & L);
break;
case 8:
printf("输入-1结束,");
printf("请输入顺序表L数据\n");
scan( &L);
printf("表L为:");
print(&L);
break;
}
system("PAUSE");
system("CLS");
}
return 0;
}