数据结构-线性表顺序存储结构上的基本运算实现(详解)

查找操作 算法思想

查找运算可采用顺数查找,即从第一个元素开始,依次将表中的的元素与所要查找的元素进行比较,如果相等,则查找成功。如果查找成功输出相应的提示信息,反之也给予相应的提示信息。

算法实现 #include<stdio.h> #include<stdlib.h> #define MAX 20 typedef struct{ int *elem; int length; int listsize; }SqList; void CreatList(SqList &L) {//建立一个线性表 L.elem=(int *)malloc(MAX * sizeof(int)); //动态数组空间分配 if(!L.elem) //! 是“非”的意思,如果没被分配空间 就结束程序。 return;//exit(0) L.listsize=MAX; printf("输入表的长度:"); scanf("%d",&L.length); printf("输入%d个数:",L.length); for(int i=0;i<L.length;i++) scanf("%d",&L.elem[i]); } void Traverse(SqList L){ //遍历 printf("表中数据为:"); for(int i=0;i<L.length;i++) printf("%3d",L.elem[i]); printf("\n"); } void LocateElem(SqList L,int e){ //查找 int i; printf("输入查找的元素:"); scanf("%d",&e); for(i=0;i<L.length;i++) { if(L.elem[i]==e){ printf("查找成功,查找元素为%d",L.elem[i]); printf("\n"); return;// =return 0;相当于是退出程序 } } printf("查找失败"); printf("\n"); } int main(void) { SqList L; CreatList(L); Traverse(L); LocateElem(L,1); return 0; } 运行演示

数据结构-线性表顺序存储结构上的基本运算实现(详解)

算法小结

首先要先创建一个线性表。

第二就是对线性表进行遍历,查找后输出。

L.elem=(int *)malloc(MAX * sizeof(int)); 动态数组空间分配, 因为要静态的数组的空间只要定义好了之后就不能再被分配了。我们这里是数组的长度是我们输入来实现的,所以是动态的。 (MAX * sizeof(int)) 这剧代码返回的是整数型的数据,所以指针用的是 int * 定义指针 的原因是因为malloc函数只能返回第一个字节的地址,但是这个地址是没有含义的,为什么说是没有意义的呢?因为只知道这个地址,但是后面有几个字节是不知道。

void CreatList(SqList &L) &代表引用,使用&后所传参数会改变,仔细观察你会发现,凡是对链表有改动的,如删除函数,增加函数,形参前面都会有&符号,那是因为调用了这个函数后,所传链表(结构体)会改变。

插入操作 算法思想

查找运算可采用顺数查找,即从第一个元素开始,依次将表中的的元素与所要查找的元素进行比较,如果相等,则查找成功。如果查找成功输出相应的提示信息,反之也给予相应的提示信息。

算法实现 #include<stdio.h> #include<stdlib.h> #define MAX 20 typedef struct{ int *elem; int length; int listsize; }SqList; void CreatList(SqList &L) {//建立一个线性表 L.elem=(int*)malloc(MAX *sizeof(int)); if(!L.elem) return;//exit(0) L.listsize=MAX; printf("输入表的长度:"); scanf("%d",&L.length); printf("输入%d个数:",L.length); for(int i=0;i<L.length;i++) scanf("%d",&L.elem[i]); } void Traverse(SqList L){ //遍历 printf("表中数据为:"); for(int i=0;i<L.length;i++) printf("%3d",L.elem[i]); printf("\n"); } void ListInsert(SqList &L) //改变链表中元素,有&符号 {//插入元素及其要插入的位置 int i; int e; printf("输入要插入位置及元素\n"); scanf("%d%d",&i,&e); printf("在顺序线性表中第%d个位置之前插入新的元素%d。\n",i,e);//在顺序线性表L中第i个位置之前插入新的元素e, if(i<1||i>L.length+1) return; //i的合法位置为1<=i<=ListLength(L)+1 int *p,*q; q=&(L.elem[i-1]); for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p; *q=e; ++L.length; return; } int main(){ SqList L; CreatList(L); Traverse(L); ListInsert(L); Traverse(L); return 0; } 运行演示

数据结构-线性表顺序存储结构上的基本运算实现(详解)

算法小结

q=&(L.elem[i-1]); 表示从链表的第i个元素开始一直到最后一个元素往后移一位.

p=&L.elem[L.length-1] 意思是p赋初值为链表的最后一个元素地址,p>=q表示循环知道p<q的时候结束,--p是使p指针的指向往前移一位.

删除操作 算法思想

用顺序表作为线性表的存储结构时,由于结点的物理顺序必须和结点的逻辑顺序保持一致,因此当需要删除第i个元素时,必须将表中位置相似i+1,i+2,...,n-1,n上的节点,依次前移到位置i,i+1,...n-1(其中n为L的表长度)。

算法实现 #include<stdio.h> #include<stdlib.h> #define MAX 20 typedef struct{ int *elem; int length; int listsize; }SqList; void CreatList(SqList &L)//对链表有改动 形参有&符号 {//建立一个线性表 L.elem=(int*)malloc(MAX *sizeof(int)); if(!L.elem) return;//exit(0) L.listsize=MAX; printf("输入表的长度:"); scanf("%d",&L.length); printf("输入%d个数:",L.length); for(int i=0;i<L.length;i++) scanf("%d",&L.elem[i]); } void Traverse(SqList L){ //遍历 printf("表中数据为:"); for(int i=0;i<L.length;i++) printf("%3d",L.elem[i]); printf("\n"); } int makesureElem(SqList L,int e)//这里需要用到两个参数,首先是 链表,另外一个就是删除的元素(表中) { int i; //确定要删除的元素 for(i=0;i<L.length;i++) { if(L.elem[i]==e) { printf("要删除的元素 位置为 %d",i+1); printf("\n"); return (i+1); } } printf("元素不存在"); printf("\n"); return 0; } int ListDelete(SqList &L){ //对链表有改动 形参有&符号 //删除元素 int i; int e; printf("输入要删除的元素"); scanf("%d",&e); i=makesureElem(L,e); if((i<1)||(i>L.length)) return 0;//i的合法值为1<=i<=ListLength(L)+1 else{ int* p,* q; p=&(L.elem[i-1]);//取回链表中每一个元素的地址赋值给p,则指针p指向的内容就是*p e=*p;//找到表中要被删除的元素“e”(也就是*p) q=L.elem+L.length-1;//尾元素的位置,更多解释看说明 for(++p;p<=q;++p)//初始化指针并移动,更多解释看说明 { *(p-1)=*p; //被删除元素之后的元素左移 } --L.length; printf("元素被删除"); } return 0; } int main(){ SqList L; CreatList(L); Traverse(L); ListDelete(L); Traverse(L); return 0; } 运行演示

数据结构-线性表顺序存储结构上的基本运算实现(详解)

算法小结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzfdx.html