C语言实现顺序表的创建及基本操作

C语言实现顺序表的创建及基本操作

今天主要是分享一下我在学习数据结构的顺序表时实现的一些基本操作,以及学习过程当中遇到的一些问题。我觉得学习这一部分内容的时候,除了要掌握基本操作方法的编写,还要学会对方法进行实例化。由于课本上这一部分的内容比较少,我也是查阅了CSDN上的许多文章才明白的。
废话到此,下面正式开始。

  1. 顺序表的结构定义
    顺序表的存储结构可以借助于一维数组来表示,一维数组的下标与元素在线性表中的序号相对应。
#include<stdio.h>
#include<stdlib.h>
#define max 100

typedef struct {//顺序表的存储结构定义 
	int data[max];//顺序表占用的数组空间 
	int last; //记录顺序表中最后一个元素在数组中的位置 空表为0
}list;
  1. 顺序表的初始化
void start(list l){//初始化顺序表 设置为空表 
	l.last=0; 
	printf("顺序表已经初始化为空表\n");
} 
  1. 对顺序表进行顺序插入
void shunxu(list *l,int n){//顺序插入  
	int i=0;
	int j;
	while(i<n)
	{
		scanf("%d",&j);
			l->data[i]=j;
            i++; 
	}
	l->last=n;
}
  1. 进行指定位置插入

    进行元素的插入后要将表长加1

void enterlist(list *l,int i,int e){//顺序表的插入操作(指定位置的插入) i为数组下标 e为要填进去的值 
	int k;
	if((i<0)||(i>l->last)){//判断插入的位置是否合法 
		printf("插入的位置不合法\n");
	}
	if(l->last>max){//判断顺序表是否已满 
		printf("表满,无法插入\n");
	}
	for(k=l->last;k>=i;k--){
		l->data[k+1]=l->data[k];
	} 
	l->data[i]=e;
	l->last++;//表长加一 
} 
  1. 对指定位置删除
    对元素删除后要将表长减1
void dellist(list *l,int i){//顺序表的删除操作 删除指定位置 数组下标为 i 的元素 
	int k;
	if(i<0||i>l->last){
		printf("删除的位置不合法\n"); 
	}
	else{
		printf("删除的元素是%d\n",l->data[i]);
		for(k=i;i<=l->last;k++){//使后面的元素依次前移 填补删除的空缺 
			l->data[k]= l->data[k+1];
		}
		l->last--;//删除一个元素 表长减一 
	}
}
  1. 顺序表的打印
void printlist(list l){//顺序表的打印 
     int i=0; 
	 while(i<l.last){
	 	printf("%d ",l.data[i]);
	 	i++;
	 }
} 
  1. 主函数
int main(){
	list l;
	start(l);
	int n;
	printf("你想输入的数据的个数:\n");
	scanf("%d",&n); 
	printf("请向顺序表中输入数据:\n");
    shunxu(&l,n); 
    printf("顺序表的值为:\n");
    printlist(l); 
	printf("\n请输入要删除元素的下标:\n") ;
	int j;
	scanf("%d",&j);
	dellist(&l,j);
	return 0;
}

运行结果:
在这里插入图片描述

遇到的问题

在进行函数的传参时遇到的问题:
首先我把顺序表的数据类型定义为list,使用的变量定义为l
变量l的定义与使用方法有两种:

  1. 通过变量定义语句
list l;
l.data[i]//访问下标为i的数据元素
l.last//得到顺序表最后一个元素的下标
l.last+1//得到顺序表的长度
  1. 通过指针变量定义语句
list l1,*l;
l=&l1;
l->data[i]//作用同上
l->last//作用同上
l->last+1//作用同上

这两种定义方式看上去很像,但实际使用的时候是有所不同的。
我总结为当使用的时候不涉及数据的改变(即查找,打印等等),两种使用方式都可以获得想要的结果。
有数据变化时,使用第二种方式才可以,否则是改变不了数据值的。例如:

void enterlist(list *l,int i,int e)//指定位置插入时的参数定义
l->data[k+1]=l->data[k];//具体语句的使用
shunxu(&l,n); //主函数中对函数的调用

总结

这是我写的第一篇博客,希望以后可以再接再厉,天道酬勤,加油加油!

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值