顺序表的基本操作
此代码是日常学习的小结
!!!仅供参考,如有错误请谅解,欢迎评论区留言。谢谢大家
开发环境:devc++,及C语言和数据结构
1.这篇博客与 顺序表的基本操作01的区别在于,这篇函数的返回是表
2.这里还额外增加了更新元素操作,还有一些判定操作都与之不同。
3.这篇可能更加简洁些。
4.至于我为什么还要写这篇是因为我当时c语言的指针还没学好,加上对结构体的数据访问还存在问题。然后想找相关博客来练习一些。
/*
* date:看于2022.6.23
* content: 也是顺序表的动态创建,不同于上一个的是这里使用了返回表的内容
*/
#include<stdio.h>
#include<stdlib.h>
#define Size 5
typedef struct Table{
int *head;
int length;
int size;
}table;
//初始化表
table initTable(){
table t;
t.head = (int *)malloc(Size*sizeof(int));
if(!t.head){
printf("申请动态内存数组失败");
exit(0);
}
t.length = 0;
t.size = Size;
return t;
}
//添加·元素
table addTable (table t,int elem, int add){ //add是插入的位置,头插还是尾插,还是中间插入
if(add>t.length+1 || add<1){
printf("插入的位置有问题\n");
return t;
}
if(t.length>=t.size){
//额外多申请一些空间
t.head = (int *)realloc(t.head,(t.size+1)*sizeof(int));
if(!t.head){
printf("储存分配失败\n");
}
t.size += 1;
}
//插入元素的后驱元素都往后移一位
for(int i=t.length-1;i>=add-1;i--){
t.head[i+1] = t.head[i];
}
t.head[add-1] = elem;
t.length++;
return t;
}
//删除表内元素
table delTable(table t,int add){
if(add>t.length||add<1){
printf("被删除的位置有问题\n");
return t;
}
//后驱元素向前移动一位
for(int i=add; i<t.length; i++){
t.head[i-1] = t.head[i];
}
t.length--;
return t;
}
//查找表内元素
int selectTable(table t,int elem){
for(int i=0; i<t.length; i++){
if(t.head[i] == elem){
return i+1;
}
}
return -1;
}
//更新表内元素
table amendTable(table t,int elem, int newElem){//更换新元素
int add = selectTable(t,elem);
t.head[add-1] = newElem;
return t;
}
//打印表内元素
void displayTable(table t){
for(int i=0; i<t.length; i++){
printf("%d ",t.head[i]);
}
printf("\n");
}
int main(){
table t1 = initTable();
for(int i =0; i<Size; i++){
scanf("%d",&t1.head[i]);
t1.length++;
}
printf("原顺序表:\n");
displayTable(t1);
printf("删除元素1:\n");
t1 = delTable(t1,1);
displayTable(t1);
printf("在第二个位置插入元素5:\n");
t1 = addTable(t1,5,2);
displayTable(t1);
printf("查找元素3的位置:\n");
int add=selectTable(t1, 3);
printf("%d\n",add);
printf("将元素3改为6:\n");
t1=amendTable(t1, 3, 6);
displayTable(t1);
return 0;
}