线性表----顺序表

//顺序表 完整举例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); }

 

原文地址:https://www.cnblogs.com/java2016/p/7636063.html