#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");//程序运行到此暂停,避免一闪而过
}
数据结构—顺序表
最新推荐文章于 2024-11-03 22:57:39 发布