数据结构(C语言版)严蔚敏->顺序表的定义及合并顺序表

Posted il_持之以恒_li

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(C语言版)严蔚敏->顺序表的定义及合并顺序表相关的知识,希望对你有一定的参考价值。

头文件

sqList.h

#ifndef SQLIST_H_INCLUDED
#define SQLIST_H_INCLUDED

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

typedef struct
    int *p;
    int lenght;
    int listsize;
SqList;

void InitList_Sq(SqList &L);
// 构造一个空的线性表L
void DestroyList_Sq(SqList &L);
// 销毁线性表L
void ClearList_Sq(SqList &L);
// 将L重置为空
bool ListEmpty_Sq(SqList L);
// 判断L是否为空
int ListLength_Sq(SqList L);
// 返回L中数据元素的个数
bool GetElem_Sq(SqList L,int pos,int &e);
// 用e返回L中第pos个数据元素的值
bool ListInsert_Sq(SqList &L,int pos,int e);
// 在L中第pos个位置之前插入新的元素e
bool ListDelete_Sq(SqList &L,int pos,int &e);
// 删除L的第pos个数据元素,并用e返回
int LocateElem_Sq(SqList L,int e);
// 返回L中第一个与e相等的数据元素的位序
#endif // SQLIST_H_INCLUDED

sqList.cpp

#include "sqList.h"
#include <stdlib.h>

void InitList_Sq(SqList &L)

    L.p=(int*)malloc(LIST_INIT_SIZE* sizeof(int));
    if(!L.p)
        exit(-1);
    L.lenght=0;
    L.listsize=LIST_INIT_SIZE;


void DestroyList_Sq(SqList &L)
    free(L.p);
    // 释放p指向的内存空间
    L.p = NULL;
    L.lenght = 0;
    L.listsize = 0;


void ClearList_Sq(SqList &L)
    L.lenght = 0;


bool ListEmpty_Sq(SqList L)
    return L.lenght == 0;


int ListLength_Sq(SqList L)
    return L.lenght;


bool GetElem_Sq(SqList L,int pos,int &e)
    if(pos<1||pos>L.lenght)
        return false;
    e = L.p[pos-1];
    return true;


bool ListInsert_Sq(SqList &L,int pos,int e)
    if(pos<1||pos>L.lenght+1)
        return false;

    if(L.lenght>=L.listsize)
        int * newbase = (int *)realloc(L.p,(L.listsize+LISTINCREMENT)*sizeof(int));
        if(!newbase)
            exit(-1);
        L.p = newbase;
        L.listsize += LISTINCREMENT;
    
    int *q = &(L.p[pos-1]);
    // q为插入位置
    for(int *p1=&(L.p[L.lenght-1]);p1>=q;--p1)
        *(p1+1) = *p1;
    *q = e;
    ++L.lenght;
    return true;


bool ListDelete_Sq(SqList &L,int pos,int &e)
   if(pos<1||pos>L.lenght)
        return false;
    int *q = &(L.p[pos-1]);
    // q为删除位置
    e = *q;
    int *p1 = &(L.p[L.lenght-1]);
    for(++q;q<=p1;q++)
        *(q-1) = *q;
    --L.lenght;
    return true;


int LocateElem_Sq(SqList L,int e)

    for(int i=0;i<L.lenght;i++)
        if(L.p[i]==e)
            return i+1;
    return -1;


主文件

main.cpp

#include <stdio.h>
#include <stdlib.h>
#include "sqList.h"


void PrintList_Sq(SqList L)
    for(int i=0;i<L.lenght;i++)
        printf("%d  ",L.p[i]);


void MerageList_Sq(SqList La,SqList Lb,SqList &Lc)
    int La_len = La.lenght;
    int Lb_len = Lb.lenght;
    int i=1,j=1,k=1;
    int a,b;
    while((i<=La_len)&&(j<=Lb_len))
        GetElem_Sq(La,i,a);
        GetElem_Sq(Lb,j,b);
        if(a>b)
            ListInsert_Sq(Lc,k++,b);
            ++j;
        else
            ListInsert_Sq(Lc,k++,a);
            ++i;
        
    
    while(i<=La_len)
        GetElem_Sq(La,i++,a);
        ListInsert_Sq(Lc,k++,a);
    
    while(j<=Lb_len)
        GetElem_Sq(Lb,j++,b);
        ListInsert_Sq(Lc,k++,b);
    


int main()

    SqList l2,l3,l4;
    int a[] = 1,3,5,7,b[] = 2,4,6,8;
    InitList_Sq(l2);
    InitList_Sq(l3);
    InitList_Sq(l4);
    for(int i=1;i<=4;i++)
        ListInsert_Sq(l2,i,a[i-1]);
        ListInsert_Sq(l3,i,b[i-1]);
    

    printf("The output results are as follows:\\nL2: ");
    PrintList_Sq(l2);
    printf("\\nL3: ");
    PrintList_Sq(l3);
    MerageList_Sq(l2,l3,l4);
    printf("\\nThe output results are as follows:\\nL4: ");
    PrintList_Sq(l4);
    return 0;


运行结果


【注】主文件为main.cpp,不是main.c,因此新建codeblocks项目时应该选择C++,否则程序执行不起来的。

然后打开main.cpp文件,需要将里面的代码全部去掉,然后写相应的C语言代码。
头文件没有生效的读者可以看看这位大佬的这篇文章,文章链接为:Code::Blocks使用—main.c引用其它.h文件引用无效解决

以上是关于数据结构(C语言版)严蔚敏->顺序表的定义及合并顺序表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构(C语言版)严蔚敏->单链表的定义及合并两个有序单链表

数据结构(C语言版)严蔚敏->单链表的定义及合并两个有序单链表

《数据结构:c语言版》(严蔚敏)知识点整合

谁有《数据结构》(C语言版)严蔚敏,清华大学2005年的课本?麻烦把目录告知,非常感谢

数据结构(C语言版)严蔚敏->队列的顺序存储(循环队列)和链式存储

数据结构(C语言版)严蔚敏->顺序栈的定义利用顺序栈解决有效的括号