主题:顺序表的一系列实验
飘yun
[专家分:0] 发布于 2006-04-16 12:46:00
顺序存储的插入和删除
菜单: 1.初始化 2.插入 3.删除 4.退出
要求在同一个程序中实现
望各位热心朋友多多帮忙,这个问题已经难了很多朋友了!
不胜感激!
回复列表 (共6个回复)
沙发
lt19870917 [专家分:750] 发布于 2006-04-16 12:56:00
#include "stdlib.h"
#include "stdio.h"
#define TRUE 1
#define ERROR 0
#define list_max 1000
#define add_max 100
struct list
{
int * elem;
int length;
int listsize;
};
//初始化线性表
void initlist(list & l)
{
l.listsize=list_max;
l.elem=(int *)malloc(sizeof(int)*(l.listsize));
if(!l.elem) exit(1);
l.length=0;
}
//销毁线性表
void destroylist(list & l)
{
if(&l)
free(&l);
else
exit(1);
}
//清空线性表元素
void clearlist(list & l)
{
if(&l)
{
free(l.elem);
l.length=0;
}
else
exit(1);
}
//判断线性表是否为空
bool listempty(list l)
{
if(&l)
{
if(l.length==0)
return(TRUE);
else
return(ERROR);
}
else
exit(1);
}
//返回线性表的长度
int listlength(list l)
{
if(&l)
return(l.length);
else
exit(1);
}
//返回线性表的第i个元素
void getelem(list l,int i,int & e)
{
if(&l&&i<=l.length)
{
e=l.elem[i-1];
}
else
exit(1);
}
int compare(int i,int j)
{
if(i>j)
return(1);
else if(i==j)
return(0);
else
return(-1);
}
int LocateElem(list l,int e,int cmp)
{
if(&l)
{
for(int i=0;i<l.length;i++)
{
if(compare(l.elem[i],e)==cmp)
return(i+1);
}
return(0);
}
else
exit(1);
}
bool PriorElem(list l,int cur_e,int & pre_e)
{
if(&l)
{
for(int i=0;i<l.length;i++)
{
if(cur_e==l.elem[i]&&i!=0)
{
pre_e=l.elem[i-1];
return(TRUE);
}
}
pre_e=NULL;
return(ERROR);
}
else
exit(1);
}
bool NextElem(list l,int cur_e,int & next_e)
{
if(&l)
{
for(int i=0;i<(l.length-1);i++)//只要循环到倒数第二个元素,因为要求cur_e不为最后一个元素
{
if(cur_e==l.elem[i])
{
next_e=l.elem[i+1];
return(TRUE);
}
}
next_e=NULL;
return(ERROR);
}
else
exit(1);
}
//在线性表的第i个元素前插入一个元素
void ListInsert(list & l,int i,int e)
{
if(&l&&i<=l.length)
{
if(l.length>=l.listsize)
{
free(l.elem);
l.elem=(int *)malloc(sizeof(int)*(l.listsize+add_max));
}
l.length++;
for(int j=0;j<l.length-i;j++)//要移位的数为原来lenth-(i-1)=现在length-i
{
l.elem[l.length-1-j]=l.elem[l.length-2-j];//移位
}
l.elem[i-1]=e;
}
else
exit(1);
}
//删除线性表的第i个元素
void listdelete(list & l,int i,int e)
{
if(&l&&i<=l.length&&i>=1)
{
l.length--;
for(int j=0;j<l.length-i+1;j++)//要移位的数为原来lenth-i=现在length-i+1
{
l.elem[i-1+j]=l.elem[i+j];//移位
}
e=l.elem[i-1];
}
else
exit(1);
}
板凳
lt19870917 [专家分:750] 发布于 2006-04-16 12:57:00
这是我自己写的线性表的抽象数据结构,是按照严<<数据结构>>
3 楼
lt19870917 [专家分:750] 发布于 2006-04-16 13:07:00
再给你两道题的解(A并B)
#include "ADT.h"
#include "stdlib.h"
void mergeAB(list & a,list & b)
{
int i,j;
if((&a)&&(&b))
{
for(i=0;i<b.length;i++)
{
for(j=0;j<a.length;j++)
{
if(b.elem[i]==a.elem[j])
break;
}
if(j==a.length)
ListInsert(a,1,b.elem[i]);
}
}
else
exit(1);
}
void main()
{
list a,b;
initlist(a);
initlist(b);
a.length=10;
b.length=20;
for(int i=0;i<10;i++)
a.elem[i]=i;
for(int j=0;j<20;j++)
b.elem[j]=j;
mergeAB(a,b);
for(int m=0;m<a.length;m++)
printf("%d ",a.elem[m]);
}
4 楼
lt19870917 [专家分:750] 发布于 2006-04-16 13:08:00
#include "ADT.h"
#include "stdio.h"
void merge(list a,list b,list & c)
{
int i=0,j=0,flag=0;
c.length=(a.length)+(b.length);
while(i<a.length&&j<b.length)
{
if(a.elem[i]>b.elem[j])
c.elem[flag++]=b.elem[j++];
else
c.elem[flag++]=a.elem[i++];
}
while(j<b.length)
c.elem[flag++]=b.elem[j++];
while(i<a.length)
c.elem[flag++]=a.elem[i++];
}
void main()
{
list a,b,c;
initlist(a);
initlist(b);
initlist(c);
a.length=10;
b.length=20;
for(int i=0;i<a.length;i++)
a.elem[i]=i;
for(int j=0;j<b.length;j++)
b.elem[j]=j;
merge(a,b,c);
for(int m=0;m<c.length;m++)
printf("%d ",c.elem[m]);
}
合并A.B到C
5 楼
飘yun [专家分:0] 发布于 2006-04-16 13:53:00
谢谢你的解答!
不过调试的时间好像要多于编的时间!
6 楼
xuexiziji [专家分:90] 发布于 2006-04-16 19:46:00
以上程序用的是什么编译器。
我来回复