//顺序表 完整举例1
#include <stdio.h>
#define MAXSIZE 100
typedef int ElemType;
typedef struct /* 定义结点元素结构 */
{ ElemType elem[MAXSIZE];
int len;
}SqList;
void SQ_init(SqList *L) /* 顺序表初始化 */
{ (*L).len=0; }
int SQ_length( SqList L ) /* 求顺序表的长度 */
{ return L.len; }
void SQ_create( SqList *L) /* 建立顺序表L*/
{ printf("请输入元素个数与各元素的值: ");
scanf("%d",&(*L).len);
for (int i=0; i<(*L).len; i++)
scanf("%d",&(*L).elem[i]); }
int SQ_get(SqList L,int i) //求顺序表L的第i个元素
{ return L.elem[i] ; }
int SQ_pre(SqList L,int i) /* 求第i个元素的前驱*/
{ return L.elem[i-1] ; }
int SQ_next(SqList L,int i) /* 求第i个元素的后继*/
{ return L.elem[i+1] ; }
void SQ_disp( SqList L ) //显示顺序表L中的元素
{ int i;
for (i=0; i<SQ_length(L); i++)
printf("%3d",L.elem[i]);
printf("
"); }
int SQ_search(SqList L, int key)
/* 在顺序表L中查找值为key的元素,如果存在返回下标*/
{ int i;
for (i=0; i< L.len; i++)
if (L.elem[i]==key ) return i;
return -1; }
void SQ_delete(SqList *L, int i)
/* 删除顺序表L中的第i个元素*/
{ int j;
for (j=i; j<(*L).len; j++ )
(*L).elem[j-1]=(*L).elem[j];
(*L).len--; }
void SQ_insert(SqList *L,int i,int x)
/* 在顺序表L中的 第i个元素后插入值为x的一个元素*/
{ int j;
for (j=(*L).len-1; j>=i+1; j--)
(*L).elem[j+1]=(*L).elem[j];
(*L).elem[i+1]=x;
(*L).len++; }
int main()
{ int k,x;
SqList sq; /* 定义顺序表sq*/
SQ_init( &sq ); /* 顺序表sq初始化*/
SQ_create( &sq ); /* 建立顺序表sq*/
printf("建立的顺序表为:
");
SQ_disp(sq); /* 显示顺序表sq*/
printf("表的长度为=%d
",SQ_length(sq));
printf("请输入结点的序号: ");
scanf("%d",&k);
printf("结点的值为:%d
", SQ_get(sq,k) );
printf("结点的前驱为:%d
", SQ_pre(sq,k) );
printf("结点的后继为:%d
", SQ_next(sq,k) );
printf("
请输入需删除的结点的序号: ");
scanf("%d",&k);
SQ_delete(&sq,k);
printf("删除结点后的顺序表为:
");
SQ_disp(sq);
printf("
请输入需插入结点的位置与值 (从0开始): ");
scanf("%d%d",&k,&x);
SQ_insert(&sq,k,x);
printf("插入结点后的顺序表为:
");
SQ_disp(sq);
} /* end */
//顺序表例2:P20例2-1 (算法2.1、算法2.6)
#include <stdio.h>
typedef struct //请比较p22的类型定义
{ int data[100];
int length;
} sqlist;
void init_list(sqlist *L) //请比较p23的函数
{
L->length=0;
}
int get_elem(sqlist L,int i)
{
return L.data[i];
}
void list_insert(sqlist *L,int i,int e)
//请比较p24的函数,i表示元素的下标
{ int j;
for (j=L->length;j>i; j--)
L->data[j]=L->data[j-1];
L->data[i]=e;
L->length=L->length+1;
}
void list_delete(sqlist *L,int i)
//请比较p24的函数,i表示元素的下标
{ int j;
for (j=i;j<L->length; j++)
L->data[j]=L->data[j+1];
L->length=L->length-1;
}
void disp(sqlist L)
//增加的测试函数,显示线性表中的元素
{ int i;
printf("线性表中的元素为:");
for (i=0; i<L.length; i++)
printf("%5d",L.data[i]);
printf("
");
}
int locate(sqlist L,int e)
//在L中查找值为e的元素,如果存在返回1,否则返回0
{ int i;
for (i=0; i<L.length; i++)
if (L.data[i]==e) return 1;
return 0;
}
void jion(sqlist *La, sqlist Lb) //请比较p20的函数
{ int i,e;
for (i=0; i<Lb.length;i++)
{ e=get_elem(Lb,i);
if (!locate(*La,e)) list_insert(La,La->length,e); }
}
int main()
{ sqlist L1={{7,3,6,10,8,9},6};
sqlist L2={{15,3,8,4,10},5};
printf("合并前
"); disp(L1); disp(L2);
jion(&L1,L2);
printf("
合并后
"); disp(L1); disp(L2);
//system("pause");
return 1;
}
//顺序表例3:P20例2-2(算法2.2、算法2.7)
#include <stdio.h>
typedef struct //请比较p22的类型定义
{ int data[100];
int length;
} sqlist;
void init_list(sqlist *L) //请比较p23的函数
{
L->length=0;
}
int get_elem(sqlist L,int i)
{
return L.data[i];
}
void list_insert(sqlist *L,int i,int e)
//请比较p24的函数,i表示元素的下标
{ int j;
for (j=L->length;j>i; j--)
L->data[j]=L->data[j-1];
L->data[i]=e;
L->length=L->length+1;
}
void list_delete(sqlist *L,int i)
//请比较p24的函数,i表示元素的下标
{ int j;
for (j=i;j<L->length; j++)
L->data[j]=L->data[j+1];
L->length=L->length-1;
}
void disp(sqlist L)
//增加的测试函数,显示线性表中的元素
{ int i;
printf("线性表中的元素为:");
for (i=0; i<L.length; i++)
printf("%5d",L.data[i]);
printf("
");
}
int locate(sqlist L,int e)
//在L中查找值为e的元素,如果存在返回1
{ int i;
for (i=0; i<L.length; i++)
if (L.data[i]==e) return 1;
return 0;
}
void Merge_list(sqlist La, sqlist Lb,sqlist *Lc)
//请比较p21的函数
{ int i,j,k,e1,e2; init_list(Lc); i=j=k=0;
while (i<La.length && j<Lb.length)
{ e1=get_elem(La,i);
e2=get_elem(Lb,j);
if ( e1<e2 ) { list_insert(Lc,Lc->length,e1); i++; }
else { list_insert(Lc,Lc->length,e2); j++; }
}
while (i<La.length )
{ e1=get_elem(La,i);
list_insert(Lc,Lc->length,e1); i++; }
while (j<Lb.length )
{ e2=get_elem(Lb,j);
list_insert(Lc,Lc->length,e2); j++; }
}
int main()
{ sqlist L1={{2,4,7,8},4};
sqlist L2={{1,3,10,12},4};
sqlist L3;
printf("
归并前:
");
disp(L1);
disp(L2);
Merge_list(L1,L2,&L3);
printf("
归并后:
");
disp(L1);
disp(L2);
disp(L3);
return 1;
}
//end
一.实验内容:顺序表的初始化、插入和删除
二.程序清单
三、思考题
1.如何实现顺序表的逆置
2.每次删除操作时,都会使得大量的数据元素移动,删除多个数据元素时,就需多次移动数据元素。能否一次进行删除多个数据元素的操作,使得数据元素的移动只进行一次。
//线性表的顺序结构算法实现
#include "stdio.h"
#include "stdlib.h"
# define OVERFLOW -2
# define OK 1
#define ERROR 0
//数据类型说明
typedef int ElemType;
typedef int Status;
# define List_init_size 100
//线性表存储空间初始分配量
# define Listincrement 10
//线性表存储空间分配增量
typedef struct{
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize;//当前分配的存储容量
// (以sizeof(ElemType)为单位)
}sqlist;
//初始化线性表:
Status InitList(sqlist &L)
{//构造一个空线性表L
L.elem=(ElemType *) malloc(List_init_size*sizeof(ElemType));
if (!L.elem) exit(OVERFLOW);
L.length=0;
L.listsize= List_init_size;
return OK;
}
//在一个空的线性表中输入N个数据:
Status sqlistinput(sqlist &L,int n)
{int i=0;
if(n>L.listsize)return ERROR;
for(;i<n;i++)
{scanf("%d",&L.elem[i]);
}
L.length=n;
return OK;
}
//判线性表是否为空
Status ListEmpty(sqlist L)
{if (!L.length) return ERROR;
else return OK;
}
//求线性表的长度
Status ListLength(sqlist L)
{ return L.length;
}
//将线性表L 的数据输出:
Status sqlistoutput(sqlist L)
{int i;
for(i=0;i<ListLength(L);i++)
printf("%4d",L.elem[i]);
printf("
");
return OK;}
//取线性表的第i个元素,其结果保存在e中
Status GetElem(sqlist l,int i,ElemType &e)
{
if (i<1 || i>l.length+1) return ERROR;
e=l.elem[i-1];
return OK;
}
//定义两个数据元素相等的比较函数
Status equal(ElemType e1,ElemType e2)
{if (e1==e2)
return OK;
else
return ERROR;
}
//根据compare()函数在线性表中定位元素e的位置
int LocateElem_sq(sqlist L,ElemType e,Status (*compare)(ElemType,ElemType)) //成功返回位序,否则返回0
{ int i=1;
ElemType *p;
p=L.elem;
while(i<=L.length &&!(*compare)(*p++,e)) ++i;
if (i<=L.length) return i;
else return 0;
}// locateElem_sq
//在线性表中求某元素的前趋结点,如存在则返回其前趋结点pre_e的值,否则返回出错信息
Status PriorElem(sqlist L,ElemType cur_e,ElemType &pre_e)
{ int pos;
pos=LocateElem_sq(L,cur_e,equal);
if(pos==0) return ERROR;
else if(pos==1) return OVERFLOW; //overflow 表示位于第一个
else{
GetElem(L,pos-1,pre_e);
return OK;
}
}
//在线性表中求某元素的后继结点
Status NextElem(sqlist L,ElemType cur_e,ElemType &next_e)
{ int pos;
pos=LocateElem_sq(L,cur_e,equal);
if(pos==0) return ERROR;
else if(pos==L.length) return OVERFLOW; //overflow 表示最后一个
else{
GetElem(L,pos+1,next_e);
return OK;
}
}
//在线性表中插入一个元素
Status Listinsert_sq(sqlist &L,int i,ElemType e) {
ElemType *p,*q,*newbase;
if (i<1 || i>L.length+1) return ERROR;
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]);
for(p=&(L.elem[L.length-1]);p>=q;--p) *(p+1)=*p;
*q=e; ++L.length;
return OK;
}// listinsert_sq;
//在线性表中删除第i个元素,其结果保留在e中
Status Listdelete_sq(sqlist &l,int i,ElemType &e)
{
ElemType *p,*q;
if (i<1||i>l.length+1) return ERROR;
p=&(l.elem[i-1]);
e=*p;
q=l.elem+l.length-1;
for(++p;p<=q;++p) *(p-1)=*p;
--l.length;
return OK;
}// listdelete_sq;
//将la和lb线性表归并到lc
void mergelist_sq(sqlist la,sqlist lb,sqlist &lc)
{ ElemType *pa,*pb,*pc,*pa_last,*pb_last;
pa=la.elem;
pb=lb.elem;
lc.listsize=lc.length=la.length+lb.length;
pc=lc.elem=(ElemType*)malloc(lc.listsize*sizeof(ElemType));
if (!lc.elem) exit(OVERFLOW);
pa_last=la.elem+la.length-1; pb_last=lb.elem+lb.length-1;
while ((pa<=pa_last)&& (pb<=pb_last))
if (*pa<=*pb) *pc++=*pa++; else *pc++=*pb++ ;
while(pa<=pa_last) *pc++=*pa++;
while(pb<=pb_last) *pc++=*pb++;
} //mergelist_sq;
//对线性表的元素进行排序
Status sortsqlist(sqlist &L)
{//冒泡排序
int i,j,len;
ElemType t;
len=ListLength(L);
for(i=len-1;i>=1;i--)
for(j=0;j<i;j++)
{if (L.elem[j]>L.elem[j+1])
{t=L.elem[j];
L.elem[j]=L.elem[j+1] ;
L.elem[j+1]=t;
}
}
return OK;
}
int main()
{sqlist la,lb,lc;
int n,m,i,e,k,cur_e,pre_e,next_e;
//建立线性表,并输入输出线性表的数据
InitList(la);InitList(lb);
printf("please input la's numbers:n(请输入线性表la的元素个数n)
");
scanf("%d",&n);
printf("please input la n numbers:( 请输入线性表la的n个元素)
");
sqlistinput(la,n);
sqlistoutput(la);
printf("
");
//调用插入函数,对线性表进行插入操作
printf("请输入要插入的元素的位置和插入的值
");
scanf("%d%d",&i,&e);
Listinsert_sq(la,i,e);
sqlistoutput(la);
//调用删除函数,对线性表进除删操作
printf("请输入要删除的元素的位置
");
scanf("%d",&i);
Listdelete_sq(la,i,e);
printf("the dele data is %d
",e);
sqlistoutput(la);
printf("please input the get data's locate
");
scanf("%d",&i);
//调用GetElem()函数,取第I个位置的元素的值。
GetElem(la,i,e);
printf("the get data is %d
",e);
printf("please input the locateelem's data :cur_e
");
//调用LocateElem_sq()函数,求元素cur_e的位置。
scanf("%d",&cur_e);
k=LocateElem_sq(la,cur_e,equal);
printf("the locate is %d
",k);
//调用PriorElem()函数,求元素cur_e的前驱。
printf("please input the cur_e data
");
scanf("%d",&cur_e);
PriorElem(la,cur_e,pre_e);
printf("the pre_e is %d
",pre_e);
//调用NextElem()函数,求元素cur_e的后继。
printf("please input the cur_e data
");
scanf("%d",&cur_e);
NextElem(la,cur_e,next_e);
printf("the next_e is %d
",next_e);
//建立两个线性表并排序然后归并
printf("please input lb's numbers:m
");
scanf("%d",&m);
printf("please input lb m numbers:
");
sqlistinput(lb,m);
printf("
");
sqlistoutput(lb);
sortsqlist(la);
printf("the sort list la is:
");
sqlistoutput(la);
sortsqlist(lb);
printf("the sort list lb is:
");
sqlistoutput(lb);
mergelist_sq(la,lb,lc);
printf("la and lb's mergelist is:
");
sqlistoutput(lc);
}