线性表----顺序表
//顺序表 完整举例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("\n");                                             }
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("建立的顺序表为:\n "); 
    SQ_disp(sq);     /* 显示顺序表sq*/
    
    printf("表的长度为=%d\n\n",SQ_length(sq)); 
    printf("请输入结点的序号: "); 
    scanf("%d",&k);   
    printf("结点的值为:%d\n", SQ_get(sq,k) );    
         printf("结点的前驱为:%d\n", SQ_pre(sq,k) );
    printf("结点的后继为:%d\n\n ", SQ_next(sq,k) );
    
    
    printf(" \n请输入需删除的结点的序号: "); 
    scanf("%d",&k);
    SQ_delete(&sq,k);
    printf("删除结点后的顺序表为:\n "); 
    SQ_disp(sq); 
    
    printf(" \n请输入需插入结点的位置与值 (从0开始): "); 
    scanf("%d%d",&k,&x);
    SQ_insert(&sq,k,x);
    printf("插入结点后的顺序表为:\n "); 
    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("\n");
}    
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("合并前\n");       disp(L1);    disp(L2);
    jion(&L1,L2);
    printf("\n合并后\n");  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("\n");
}    
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("\n归并前:\n");
    disp(L1);
    disp(L2);
    Merge_list(L1,L2,&L3);
    printf("\n归并后:\n");
    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("\n");
   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)\n");
 scanf("%d",&n);
 printf("please input la n numbers:( 请输入线性表la的n个元素)\n");
 sqlistinput(la,n);
 sqlistoutput(la);
 printf("\n");
 //调用插入函数,对线性表进行插入操作
 printf("请输入要插入的元素的位置和插入的值 \n");
 scanf("%d%d",&i,&e);
 Listinsert_sq(la,i,e);
 sqlistoutput(la);
  //调用删除函数,对线性表进除删操作
 printf("请输入要删除的元素的位置\n");
 scanf("%d",&i);
 Listdelete_sq(la,i,e);
 printf("the dele data is %d\n",e);
 sqlistoutput(la);
 
 printf("please input the get data's locate\n");
 scanf("%d",&i);
//调用GetElem()函数,取第I个位置的元素的值。
 GetElem(la,i,e);
 printf("the get data is %d\n",e);
 printf("please input the locateelem's data :cur_e\n");
 
//调用LocateElem_sq()函数,求元素cur_e的位置。
scanf("%d",&cur_e);
 k=LocateElem_sq(la,cur_e,equal);
 printf("the locate is %d\n",k);
 
//调用PriorElem()函数,求元素cur_e的前驱。
 printf("please input the cur_e data\n");
 scanf("%d",&cur_e);
 PriorElem(la,cur_e,pre_e);
 printf("the pre_e is %d\n",pre_e);
 
//调用NextElem()函数,求元素cur_e的后继。
 printf("please input the cur_e data\n");
 scanf("%d",&cur_e);
 NextElem(la,cur_e,next_e);
 printf("the next_e is %d\n",next_e);
 
 //建立两个线性表并排序然后归并
 printf("please input lb's  numbers:m\n");
 scanf("%d",&m);
 printf("please input lb m numbers:\n");
 sqlistinput(lb,m);
 printf("\n");
 sqlistoutput(lb);
 sortsqlist(la);
 printf("the sort list la is:\n");
 sqlistoutput(la);
 sortsqlist(lb);
 printf("the sort list lb is:\n");
 sqlistoutput(lb);
 mergelist_sq(la,lb,lc);
 printf("la and lb's mergelist is:\n");
 sqlistoutput(lc);
}
                    
                
                
            
        
浙公网安备 33010602011771号