顺序表
来源:互联网 发布:国外怎么看歼20知乎 编辑:程序博客网 时间:2024/04/30 12:41
线性表顺序存储的相关操作
发表于:2010-09-10 18:41 | 分类:个人日记 阅读:(14) 评论:(0)
源代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define list_size 100
#define list_add 100
typedef struct
{//用结构体表示顺序表
int *elem;
int length;
int listsize;
}Sqlist;
//构造一个空的线性列表
int initlist(Sqlist &l){
l.elem = (int *)malloc(list_size*sizeof(int));
if(!l.elem){
printf("Can not to allocate memory!");
exit(1);
}
l.length=0;
l.listsize=list_size;
return 1;
}
//向线性表中插入元素
int InitLinklist(Sqlist &L, int n)
{
int *p,i;
if(n>L.listsize)
{
L.elem=(int*)realloc(L.elem,sizeof(int)*(list_size+list_add));
L.listsize+=list_add;
}
if(!L.elem)
exit(1);
p=L.elem;
for(i=0;i<n;i++)
{
scanf("%d",p);
printf("%4d",*p);
p++;
++L.length;
}
printf("/n");
return 1;
}
//插入元素
int listinsert(Sqlist &l,int i,int e)
{
int *newbase,*q,*p;
if(i<1||i>l.length+1)
return 0;
if(l.length>l.listsize){
newbase=(int *)realloc(l.elem,(l.listsize+list_add)*sizeof(int));
if(!newbase){
printf("Can not to allocate memory!");
exit(1);
}
l.elem=newbase;
l.listsize+=list_add;
}
q=&(l.elem[i-1]);
for(p=&(l.elem[l.length-1]);p>=q;--p)
*(p+1)=*p;
*q=e;
++l.length;
return 1;
}
//删除元素
int listdelete(Sqlist &l,int i,int &e)
{
int *p,*q;
if((i<1)||(i>l.length))
return 0;
p=&(l.elem[i-1]);
e=*p;
q=l.elem+l.length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
--l.length;
return 1;
}
//查找元素
int locate(Sqlist l,int e){
int *p;
int i=1;
p=l.elem;
while(i<l.length){
if(*p++!=e){
++i;
}
else
break;
};
if(i<=l.length)
return i;
else
return 0;
}
int main()
{
int choice,e,i,k,m;
int *a,*b;
Sqlist la;
initlist(la);
printf("请输入顺序线性表的长度:");
scanf("%d",&m);
printf("请输入线性表的%d元素:",m);
InitLinklist(la,m);
printf("0.退出操作/n");
printf("1.增加元素/n");
printf("2.删除元素/n");
printf("3.查找元素/n");
printf("请输入你要执行的操作:");
while(scanf("%d",&choice)!=EOF){
if(choice==0)
return 0;
else if(choice==1){
printf("请输入你要增加的位置及元素:");
scanf("%d %d",&i,&e);
k=listinsert(la,i,e);
if(k==1){
for(a=la.elem;a<(la.elem+la.length);a++)
printf("%5d",*a);
printf("/n");
}
else
printf("操作失败!");
}
else if(choice==2){
printf("请输入你要删除的位置及元素:");
scanf("%d %d",&i,&e);
k=listdelete(la,i,e);
if(k==1){
for(a=la.elem;a<(la.elem+la.length);a++)
printf("%5d",*a);
printf("/n");
}
else
printf("操作失败!");
}
else{
printf("请插入查找的元素:");
scanf("%d",&e);
k=locate(la, e);
if(k!=0)
printf("查找的元素在第%d个位置/n",k+1);
else
printf("线性表中没有此元素/n");
}
printf("请输入你要执行的操作:");
}
}