数据结构-线性表(一)——顺序存储结构

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_39286218/article/details/80164169

任务和代码:

main.cpp
/* 
*All rights reserved 
*文件名称:main.c 
*作者: Osseyda 
完成日期:2018.5.2 
*版本号:v2. 
* 
*问题描述:顺序表的应用
*问题输出:1.程序的多文件组织形式 ; 2.要求算法的时间复杂度为O(n)
*/  
#include "list.h"
#include <stdio.h>
int main()
{
    SqList *sq;
    InitList(sq);
    ElemType x[7]= {5,8,7,2,5,4,9};
    ElemType e1, e2;
    /*创建线性表并显示*/
    CreateList(sq, x, 7);
    printf("创建线性表:");
    DispList(sq);
    printf("\n");
    /*删除某个值对应的所有元素*/
    delnode1(sq,5);
    printf("删除值为5的所有元素后的线性表:");
    DispList(sq);
    printf("\n");
    /*判断线性表是否为空,不为空则打印长度*/
    if(ListEmpty(sq))
        printf("该线性表为空");
    else
        printf("该线性表不为空且长为%d",ListLength(sq));
    printf("\n\n");
    /*指定位置插入元素并打印新的线性表*/
    ListInsert(sq,2,3);
    printf("在第2个元素位置添加元素3:");
    DispList(sq);
    printf("\n");
    /*读指定位置的元素值并打印*/
    if(GetElem(sq,4,e1))
        printf("4号位置对应的元素: %d",e1);
    else
        printf("位置不在线性表长度之内");
    printf("\n\n");
    /*读指定元素位置并打印*/
    if(LocateElem(sq,11))
        printf("元素值11对应的位置为: %d",LocateElem(sq,7));
    else
        printf("元素值11对应元素不在此线性表内");
    printf("\n\n");
    /*删除指定位置的元素并打印新的线性表*/
    ListDelete(sq,5,e2);
    printf("删除5号位置元素后的新线性表:");
    DispList(sq);
    printf("\n");
    /*销毁线性表*/
    DestroyList(sq);
    /*合并线性表*/
    SqList *sq1, *sq2, *sq0;
    InitList(sq1);
    ElemType x1[6]= {5,8,7,2,4,9};
    CreateList(sq1, x1, 6);
    InitList(sq2);
    ElemType x2[6]= {3,8,5,1,4,8};
    CreateList(sq2, x2, 6);
    unionList(sq1, sq2, sq0);
    printf("合并后的线性表:");
    DispList(sq0);
    printf("\n");
    /*以表中首元素分离所有元素*/
    move1(sq0);
    printf("以表中首元素分离所有元素后的线性表:");
    DispList(sq0);
    printf("\n");
    /*将所在奇数移到所有偶数的前面*/
    sortOdd(sq0);
    printf("奇数在前偶数在后的线性表:");
    DispList(sq0);
    printf("\n");
    /*删除元素在[x, y]之间的所有元素*/
    delnodes(sq0, 4, 8);
    printf("删除元素在[4, 8]之间的所有元素后的线性表:");
    DispList(sq0);
    return 0;
}
list.h
#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED

#define MaxSize 50
typedef int ElemType;
typedef struct
{
    ElemType data[MaxSize];
    int length;
} SqList;
void CreateList(SqList *&L, ElemType a[], int n);//用数组创建线性表
void InitList(SqList *&L);//初始化线性表InitList(L)
void DestroyList(SqList *&L);//销毁线性表DestroyList(L)
bool ListEmpty(SqList *L);//判定是否为空表ListEmpty(L)
int ListLength(SqList *L);//求线性表的长度ListLength(L)
void DispList(SqList *L);//输出线性表DispList(L)
bool GetElem(SqList *L,int i,ElemType &e);//求某个数据元素值GetElem(L,i,e)
int LocateElem(SqList *L, ElemType e);//按元素值查找LocateElem(L,e)
bool ListInsert(SqList *&L,int i,ElemType e);//插入数据元素ListInsert(L,i,e)
bool ListDelete(SqList *&L,int i,ElemType &e);//删除数据元素ListDelete(L,i,e)
void unionList(SqList *LA, SqList *LB, SqList *&LC);//合并线性表unionList(LA,LB,LC)
void delnode1(SqList *&L, ElemType x);//删除某个值的所有元素delnode1(L,x)
void move1(SqList *&L);//以首元素的大小分离所有元素move1(L)
void delnodes(SqList *&L, ElemType e1, ElemType e2);//保存两元素间的元素delnodes(L,e1,e2)
void sortOdd(SqList *&L);//奇数在前偶数在后排列元素sortOdd(L)
#endif
list.cpp
#include <stdio.h>
#include <malloc.h>
#include "list.h"

//1.用数组创建线性表
void CreateList(SqList *&L, ElemType a[], int n)
{
    int i;
    L=(SqList *)malloc(sizeof(SqList));
    for (i=0; i<n; i++)
        L->data[i]=a[i];
    L->length=n;
}

//2.初始化线性表
void InitList(SqList *&L)   //引用型指针
{
    L=(SqList *)malloc(sizeof(SqList));
    //分配存放线性表的空间
    L->length=0;
}

//3.销毁线性表DestroyList(L)
void DestroyList(SqList *&L)
{
    free(L);
}

//4.判定是否为空表ListEmpty(L)
bool ListEmpty(SqList *L)
{
    return(L->length==0);
}

//求线性表的长度ListLength(L)
int ListLength(SqList *L)
{
    return(L->length);
}

//5.输出线性表DispList(L)
void DispList(SqList *L)
{
    int i;
    if (ListEmpty(L)) return;
    for (i=0; i<L->length; i++)
        printf("%d ",L->data[i]);
    printf("\n");
}

//6.求某个数据元素值GetElem(L,i,e)
bool GetElem(SqList *L,int i,ElemType &e)
{
    if (i<1 || i>L->length)  return false;
    e=L->data[i-1];
    return true;
}

//7.按元素值查找LocateElem(L,e)
int LocateElem(SqList *L, ElemType e)
{
    int i=0;
    while (i<L->length && L->data[i]!=e) i++;
    if (i==L->length)  return 0;
    else  return i+1;
}

//8.插入数据元素ListInsert(L,i,e)
bool ListInsert(SqList *&L,int i,ElemType e)
{
    int j;
    if (i<1 || i>L->length+1)
        return false;   //参数错误时返回false
    i--;            //将顺序表逻辑序号转化为物理序号
    for (j=L->length; j>i; j--) //将data[i..n]元素后移一个位置
        L->data[j]=L->data[j-1];
    L->data[i]=e;           //插入元素e
    L->length++;            //顺序表长度增1
    return true;            //成功插入返回true
}

//9.删除指定位置的元素ListDelete(L,i,e)
bool ListDelete(SqList *&L,int i,ElemType &e)
{
    int j;
    if (i<1 || i>L->length)  //参数错误时返回false
        return false;
    i--;        //将顺序表逻辑序号转化为物理序号
    e=L->data[i];
    for (j=i; j<L->length-1; j++) //将data[i..n-1]元素前移
        L->data[j]=L->data[j+1];
    L->length--;              //顺序表长度减1
    return true;              //成功删除返回true
}

//10.线性表的合并
void unionList(SqList *LA, SqList *LB, SqList *&LC){
    int lena, i;
    ElemType e;
    InitList(LC);
    for(i=1; i<=ListLength(LA); i++){
        GetElem(LA,i,e);
        ListInsert(LC,i,e);
    }
    lena=ListLength(LA);
    for(i=1; i<ListLength(LB); i++){
        GetElem(LB,i,e);
        if(!LocateElem(LA,e))
             ListInsert(LC,++lena,e);
    }
}

//11.删除指定值的元素
void delnode1(SqList *&L, ElemType x){
    int k=0, i;
    for(i=0; i<L->length; i++){
        if(L->data[i]!=x){
            L->data[k]=L->data[i];
            k++;
        }
    }
    L->length=k;
}

//12.根据指定元素按其大小分离表中所有元素
void move1(SqList *&L){
    int i=0, j=L->length-1;
    ElemType pivot=L->data[0];
    ElemType tmp;
    while(i<j){
        while(L->data[j]>pivot)
            j--;
        while(L->data[i]<=pivot)
            i++;
        if(i<j){
            tmp=L->data[i];
            L->data[i]=L->data[j];
            L->data[j]=tmp;
        }
    }
    tmp=L->data[0];
    L->data[0]=L->data[j];
    L->data[j]=tmp;
}

//13.删除元素在[x, y]之间的所有元素
void delnodes(SqList *&L, ElemType e1, ElemType e2){
    int i, k=0;
    for(i=0; i<L->length; i++){
        if(L->data[i]>=e1 && L->data[i]<=e2){
            L->data[k]=L->data[i];
            k++;
        }
    }
    L->length=k;
}

//14.将所在奇数移到所有偶数的前面
void sortOdd(SqList *&L){
    int i,j=0,k=0;
    ElemType a[L->length];
    for(i=0; i<L->length; i++){
        if(L->data[i]%2==0){
            a[j]=L->data[i];
            j++;
        }
        else{
            L->data[k]=L->data[i];
            k++;
        }
    }
    for(j=0; j<L->length-k; j++){
        L->data[k]=a[j];
        k++;
    }
}

运行结果:



知识点总结:

    1. 线性表在调用函数返回后要保证不被释放,线性表的函数参数要设置成指针的引用:Sqlist *&L

    2.线性表基本运算的实现

    3.分离元素的算法思想

    4.尝试从时间复杂度的角度设计算法

心得:

    暂别之后,我胡汉三又回来啦 ^_^ , CSND界面优化的好多,手却生疏了好多 - -|||

   

扫描二维码关注公众号,回复: 5921731 查看本文章


猜你喜欢

转载自blog.csdn.net/sinat_39286218/article/details/80164169