zoukankan      html  css  js  c++  java
  • 线性表——基本操作

    定义线性表结构+初始化

     1 //定义线性表结构
     2 typedef struct
     3 {
     4     int *elem;//存储空间基址
     5     int length;//当前长度
     6     int listsize;//当前分配的存储容量
     7 }Sqlist;
     8 //线性表初始化
     9 int InitList_Sq(Sqlist *L)
    10 {
    11     L->elem=(int*)malloc(init_list*sizeof(int));//动态开辟一维数组
    12     if(!L->elem)
    13         exit(OVERALLOCATE);//分配失败检验
    14     L->length=0;//空表初始化长度为0
    15     L->listsize=init_list;
    16     return OK;
    17 }

    线性表输入内容(注意输入量超过分配空间的扩容函数)

     1 //线性表输入内容
     2 int Input_Sq(Sqlist *L,int n)//输入内容的函数,n为输入数据的个数
     3 {
     4     int *newbase,i;
     5     if(n<0)
     6         return ERROR;
     7     if(n>L->listsize)//输入量超过分配空间
     8     {
     9         newbase=(int*)malloc(listincreament*sizeof(int));
    10         if(!newbase)
    11             exit(OVERALLOCATE);//查错检验
    12         L->elem=newbase;
    13         L->listsize+=listincreament;
    14     }
    15     printf("请输入元素:
    ");
    16     for(i=0;i<n;i++)
    17         {
    18             scanf("%d",&L->elem[i]);
    19             L->length++;
    20         }
    21     return OK;
    22 }

    增(线性表插入元素注意插入很多元素导致之前分配空间不足的重新调整扩容

     1 //线性表插入元素
     2 int listinsert_Sq(Sqlist *L,int i,int e)
     3     {
     4         int *newbase;
     5         int j;
     6         if(i<1||i>L->length+1)//插入位置不在当前长度范围内的查错
     7             return ERROR;
     8         if(L->length>=L->listsize)//插入很多元素导致之前分配空间不足
     9         {
    10             newbase=(int*)realloc(L->elem,(L->listsize+listincreament)*sizeof(int));
    11             if(!newbase)
    12                 exit(OVERALLOCATE);//分配失败差错
    13             for(int j=0;j<L->length;j++)
    14             {
    15                 newbase[j]=L->elem[j];
    16             }
    17             L->elem=newbase;//新基址
    18             L->listsize+=listincreament;//两处更新,重新分配
    19         }
    20         for(j=L->length-1;j>=i-1;j--)
    21         {
    22             L->elem[j+1]=L->elem[j];//插入位置之后元素的后移
    23         }
    24         L->elem[i-1]=e;//插入e
    25         ++L->length;//注意表长变化
    26         return OK;
    27 }

    /*注:

    realloc函数用来为ptr重新分配大小为size的一块内存

    函数形式为:
    void * realloc ( void * ptr, size_t new_size );

    */

     1 //线性表删除元素
     2 int listdelete_Sq(Sqlist *L,int i)
     3 {
     4     int e;
     5     int j;
     6     if(i<1||i>L->length)
     7         return ERROR;
     8     e=L->elem[i-1];//将删除元素赋给e
     9     for(j=i-1;j<=L->length-1;j++)
    10         {
    11             L->elem[j]=L->elem[j+1];//被删除位置之后元素的前移
    12         }
    13     --L->length;
    14     return OK;
    15 }

     1 //线性表查找元素函数
     2 int find_Sq(Sqlist *L,int e)
     3 {
     4     int i;
     5     for(i=0;i<L->length;i++)
     6     {
     7         if(L->elem[i]==e)
     8             return i+1;
     9     }
    10     return 0;
    11 }

    线性表输出函数

     1 //线性表输出
     2 int output_Sq(Sqlist*L,int i)
     3 {
     4     int j;
     5     printf("更新后的线性表为:
    ");
     6     for(j=0;j<i;j++)
     7     {
     8         printf("%d	",L->elem[j]);
     9     }
    10     return OK;
    11 }

    主函数测试

     1 //主函数测试    
     2 int main()  
     3 {
     4     Sqlist MY;
     5     char a;
     6     a='Y';
     7     int k;
     8     int data;
     9     int position;
    10     int finddata;
    11     int b;
    12     InitList_Sq(&MY);
    13     printf("请输入元素的个数;");
    14     scanf("%d",&k);
    15     Input_Sq(&MY,k);
    16     while(a=='Y')
    17     {
    18         
    19         printf("请输入要删除元素的位置:");
    20         scanf("%d",&position);
    21         listdelete_Sq(&MY,position);
    22         output_Sq(&MY,k-1);
    23         
    24         printf("
    请输入要插入的元素:
    ");
    25         scanf("%d",&data);
    26         printf("
    请输入要插入的位置
    ");
    27         scanf("%d",&position);
    28         listinsert_Sq(&MY,position,data);
    29         output_Sq(&MY,k);
    30         
    31         printf("
    请输入要查找的元素:");
    32         scanf("%d",&finddata);
    33         b=find_Sq(&MY,finddata);
    34         if(b!=0)
    35             printf("位置为:%d",b);
    36         else
    37             printf("没有这个元素!");
    38         
    39         printf("
    是否继续?(Y:继续N:结束)
    ");
    40         getchar();
    41         scanf("%c",&a);
    42     
    43     }
    44     return OK;
    45 }
    46     

     形参为指针,实参传递地址&……;形参为地址,实参传递线性表名称L(即首地址)

  • 相关阅读:
    c/c++本地时间获取
    c++为什么要面向对象?
    设置c++中cout输出的字体颜色
    c++11并行、并发与多线程编程
    奇怪吸引子---RayleighBenard
    奇怪吸引子---QiChen
    奇怪吸引子---Qi
    奇怪吸引子---NoseHoover
    奇怪吸引子---NewtonLeipnik
    奇怪吸引子---LuChen
  • 原文地址:https://www.cnblogs.com/YOLO-in-the-sun/p/12810555.html
Copyright © 2011-2022 走看看