数据结构—顺序表

#include "StdAfx.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>



//定义顺序表类型

typedef int DataType;//给int取别名为DataType 使用户更直观其意(语法:typedef [oldname] [newname])
struct List//定义结构体类型struct List
{
    int Max;//顺序表最大元素个数为Max
    int n;//顺序表实际元素个数为n
    DataType *elem;//(相当于"int *elem"定义了一个指针变量) 待会儿elem动态分配内存后变量名elem指向分配空间首地址 
};
typedef struct List *SeqList;//给struct List*取别名为Seqlist(之后定义变量时就不用写"struct List *[变量名]"了 直接"Seqlist [变量名]"即可)



//创建空顺序表

SeqList SetNullList_Seq(int m)//函数SetNullList_Seq()创建顺序表,m为表中元素个数,函数返回值为指向struct List类型指针,由于空顺序表所以返回空指针NULL
{
    SeqList slist = (SeqList)malloc(sizeof(struct List));//(相当于"struct List *slist; stlist=(struct List*)...",即slist是一个指向struct List类型的指针变量,(*slist)即为创建的顺序表)向系统申请分配结构体struct List那么大的内存(若分配成功则返回指向被分配内存的指针,否则返回空指针NULL)并将其返回值强制类型转换为SeqList类型
    if (slist != NULL) //若分配内存成功则执行如下代码
    {
        slist->elem = (DataType*)malloc(sizeof(DataType) * m);//(相当于"(*slist).elem=...")申请大小为m个DataType那么大的空间(DataType即为int 一个int占4个字节 所以相当于分配4m个字节的空间),elem是一个指向DataType类型的指针
        if (slist->elem)//若DataType空间分配成功则执行如下代码
        {
            slist->Max = m;//顺序表的最大值
            slist->n = 0; //顺序表长度赋值为0
            return(slist);
        }
        else free(slist);//用free()函数释放内存块
    }
    printf("out of space!!\n");
    return NULL;
}



//判断顺序表是否为空

int IsNullList_seq(SeqList slist)
{
    return(slist->n == 0);//(相当于"(*slist).n==0")顺序表长度为0返回1,不为0返回0(即空表的话返回1)
}



//插入算法

int InsertPre_seq(SeqList slist, int p, DataType x)//在线性表slist的下标p位置插入x,插入位置的原元素及其后面所有元素往后移,成功返回1,否则返回0
{
    int q;
    if (slist->n >= slist->Max)//若顺序表满或溢出则无法再插入元素,返回0
    { 
        printf("overflow");return(0);
    }
    if (p<0 || p>slist->n) //若下标p没在[0,n]范围之间,则不存在下标为p的元素,返回0
    {  
        printf("not exist!\n"); return(0);
    }
    for (q = slist->n - 1; q >= p; q--)//插入位置以及之后的元素后移
        slist->elem[q + 1] = slist->elem[q];
    slist->elem[p] = x;  //(即"(*slist).elem[p]=x")在位置p插入元素x
    slist->n = slist->n + 1;   //顺序表长度加1
    return(1);
}



//删除算法

int DelIndex_seq(SeqList slist, int p) //删除下标为p的元素
{
    int q;
    if (p < 0 || p >= slist->n) //若下标p没在[0,n)范围之间,则不存在下标为p的元素,返回0
    {
        printf("Not exist\n");
        return 0;
    }
    for (q = p; q < slist->n - 1; q++) //下标p之后的元素向前移动覆盖
    { 
        slist->elem[q] = slist->elem[q + 1];
    }
    slist->n = slist->n - 1; //顺序表长度减1
    return 1;
}



//顺序查找

int LocateIndex_seq(SeqList slist, int x)//查找值为x的元素,返回元素所在下标
{
    int q;
    for (q = 0;q < slist->n;q++)
	{
        if (slist->elem[q] == x)//查找成功,返回对应的下标
            return q;
    }
    return -1;//查找失败,返回-1
}



//二分查找(对于递增有序顺序表)

int binsearch(SeqList slist, int key, int* pos)//查找与key值相等的元素并输出下标,成功返回1,不成返回-1
{
    int index = 1;//index记录查找了多少次
	int mid;//记区间中间元素下标
    int low = 0;//左区间下标为0
	int high = slist->n - 1;//右区间为n-1(即最后一个元素下标)
    while (low <= high)
    {
        mid = (low + high) / 2;
        if (slist->elem[mid] == key)//若中间元素即为所找则已找到
		{
            *pos = mid;
            printf("找到,共进行%d次比较\n", index);
            printf("要找的数据%d在位置%d上\n", key, mid);
            return 1;
        }
        else if (slist->elem[mid] > key)//若中间元素不为所找则将其与key比较,重置查找区间
                    high = mid - 1;
        else  low = mid + 1;
        index++;
    }
    *pos = low;
    printf("没有找到,共进行%d次比较\n", index - 1);
    printf("可将此数插入到位置%d上\n", *pos);
    return -1;
}



//打印顺序表

void printList(SeqList slist)
{
    printf("\n");
    if (IsNullList_seq(slist))
        printf("\n The list is NULL ! \n");
    else
    {
        for (int i = 0;i < slist->n;i++)
            printf("%d ",slist->elem[i]);
    }
    printf("\n");
}



//主函数

int main()
{
    int m = 10;//顺序表的长度m为10
    SeqList list1 = SetNullList_Seq(m);//建空表list1
    for (int i = 0;i < m - 1;i++)//给顺序表内存放0.1.2.3.4.5.6.7.8
    {
        list1->elem[i] = i;
    }
    list1->n = m - 1;//实际存放n=9个元素
    printList(list1);//打印原始顺序表

    InsertPre_seq(list1, 1, 9);//在下标为1的元素位置插入9
    printList(list1);

    DelIndex_seq(list1, 1);//删除下标为1的元素
    printList(list1);

    printf("The location of %d is %d\n", 2, LocateIndex_seq(list1,2));//(输出2在哪里查找到的)顺序查找

    int pos = 0;
    binsearch(list1, 5, &pos);//二分查找

	system("pause");//程序运行到此暂停,避免一闪而过
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值