线性表的顺序存储
你好! 这是我第一次使用博客记录我学习的生活,闲话不多说,在你基本了解C语言后或者对数组,指针,结构体有比较好的一个掌握的话,那么你学习第一章后,理解一下顺序表概念,就从阿牛理解的角度阐述和操作这个顺序表(静态)记录一下我的操作。
下面展示我的 相关代码片
。
1、顺序表类型的定义
#include <stdio.h>
#include <stdlib.h>
#define SIZE 100
void IntList(SeqList *L){ //初始化顺序表
L->length = 0;
}
- 顺序表SeqList是一个结构体
- 包括两个成员data数组和顺序表的实时长度length;
首先你要想到,如果要想通过一个函数完成外部参数,就要给函数传参时进行地址传递,而且了解这一个结构体变量就是一个顺序表,操作的是针对data数组;
2、顺序表的初始化
void IntList(SeqList *L){ //初始化顺序表
L->length = 0;
}
3、顺序表的建立
/*插入顺序表元素 */
void CreatList(SeqList *L,int n){
int i;
printf("请输入%d个整数:",n);
for(i=0;i<n;i++){
scanf("%d",&L->data[i]);
}
L->length = i;
}
此处无非就是对这个结构体元素的**data[SIZE]**针对操作,进行一个复制操作,而传入的参数是指针 *SeqList L,所以对结构体指针指向的语法就是 L->data[i];
4、 查找操作
1、按序号查找
/*按序号查找*/
int GetElem(SeqList *L,int n,DataType *number){ //获取顺序表中第i位元素函数
if(n<0||n>L->length+1){
printf("查找超出边范围!!!!\n");
return 0;
}
*number = L->data[n-1];
return 1;
}
DataType *number参数的存在就是Wie了将查找到的数据元素返回到外部变量当中;
2、按值查找
int Locate(SeqList *L,DataType x){//本地查找一个数字
int i=0;
for(i=0;i<L->length;i++){
if(x == L->data[i]){
return i+1;
}
}
return 0;
}
5、插入操作
int InsElem(SeqList *L,int i,DataType x){//在某一位上插入一个数值
int j;
if(L->length == SIZE){
printf("顺序表已满!");
return 0;
}
if(i<1||i>L->length+1){
printf("插入位置出错!");
return 0;
}
if(i==L->length+1){
L->data[i-1] = x;
L->length++;
return 1;
}
for(j=L->length-1;j>=i-1;j--){
L->data[j+1]=L->data[j];
}
L->data[i-1] = x;
L->length++;
return 1;
}
请听口诀:要插先看满,位置合理否,先移后插,再自增;
6、删除操作
int DelElem(SeqList *L,int i,DataType *x){
int j;
if(L->length == 0){
printf("顺序表为空!\n");
return 0;
}
if(i<0||i>L->length){
printf("不存在第%d位元素\n",i);
return 0;
}
*x = L->data[i-1];
for(j=i;j<L->length;j++){
L->data[j-1] = L->data[j];
}
L->length--;
printf("\n删除完成\n");
return 1;
}
请听口诀:要删先看空,删位合理否,先删后移,再自减;
其实相对较难理解的就是插入操作和删除操作、针对这两个模块,首先逻辑要清晰,要么重点理解移位操作!!!(这里实际操作就可有多种)
7、输出
void MyPrintf(SeqList *L){ //显示顺序表内容
int i;
for(i=0;i<L->length;i++){
printf("%d\t",L->data[i]);
}
printf("\n");
}
8、显示菜单函数
void Menu(){
printf("\t\t顺序表的各种操作\n");
printf("======================================\n");
printf("\t1——建立顺序元素\n");
printf("\t2——插入元素\n");
printf("\t3——删除元素\n");
printf("\t4——按位置查找元素\n");
printf("\t5——按元素值查找元素在表中的位置\n");
printf("\t6——求顺序表的长度 \n");
printf("\t0——返回\n");
printf("======================================\n");
printf("请输入菜单号(0-6):\n");
}
9、完整的顺序表(静态)操作
其实就是通过while 循环 和 switch 选择语句将函数的调用及其操作在主函数里人性化处理
int main() {
SeqList list;
int i;
DataType a,n;
char ch1,ch2,b='a';
ch1 = 'y';
while(ch1=='y'||ch1=='Y'){
Menu();
scanf("%c",&ch2);
getchar();
switch(ch2){
case '1':
IntList(&list);//初始化顺序表
printf("请输入建立线性表的个数:");
scanf("%d",&a);
CreatList(&list,a);
printf("建立的线性表为:");
MyPrintf(&list);
break;
case '2':
printf("请输入要插入的位置:");
scanf("%d",&i);
printf("请输入要插入的元素值:");
scanf("%d",&n);
if(InsElem(&list,i,n)){
printf("已经成功在第%d位上插入%d,插入后的线性表是:",i,n);
MyPrintf(&list);
}else{
printf("输入插入参数出错!\n");
}
break;
case '3':
printf("请输入要删除元素的位置:");
scanf("%d",&i);
if(DelElem(&list,i,&a)){
printf("已成功在%d上删除元素%d\n",i,a);
MyPrintf(&list);
}else{
printf("输入删除参数出错!\n");
}
break;
case '4':
printf("请输入需要查找的元素位置(从1开始):");
scanf("%d",&i);
if(GetElem(&list,i,&a)){
printf("当前线性表的第%d个元素是%d\n",i,a);
}else{
printf("查找输入的位置参数出错\n");
}
break;
case '5':
printf("请输入需要查找的元素:");
scanf("%d",&n);
if(Locate(&list,n)){
printf("查找元素值为%d的位置为:%d\n",n,Locate(&list,n));
}else{
printf("该表中无此元素\n");
}
break;
case '6':
printf("当前线性表的长度为:%d\n",list.length);
break;
case '0':
ch1 ='n';
printf("退出程序!!!\n");
break;
default :
printf("输入有误,请输入0-6之间的数字!\n");
}
if(ch2 != '0'){
// getchar();
// printf("\n按r/R键结束,按任意键返回主菜单!\n");
// scanf("%c",&b);
// if(b == 'R'||b== 'r'){
// ch1 = 'n';
// }
getchar();
printf("\n按回车键继续/结束,按任意键返回主菜单!\n");
scanf("%c",&b);
getchar();
if(b == '\xA'){
ch1 = 'n';
}
}
}
return 0;
}
本程序代码仅供大家参考和我对学习的据结构的一个成长记录,内容有不足欠妥之处还望对阿牛多多包涵,共同探讨。