数据结构——线性表的顺序存储

大家好,感谢您过来浏览本人的博客,由于想打好数据结构的基础,所以从一开始就不想落下,实践与理论相结合,相信一定会学好这门非常重要的课程。这篇文章介绍了顺序表的一些相关操作,其中包括初始化,创建,循环遍历,查找,插入,删除,内容简单,相信许多大佬都已经非常熟练,那就给萌新提提建议吧,定虚心接受!

奋斗


                            线性表的顺序存储——顺序表

typedef struct{                 //使用结构体来存放顺序表的首地址,长度和当前分配的存储容量     
         int * p;
int length;
int listsize;
}List;
动态开辟存储空间用到函数void * malloc(unsigned int size);
改变开辟空间大小用到函数void *realloc(void *p,unsigned int size);
以上俩函数都在头文件#include<stdlib.h>中。本该是掌握的知识,现在才翻书学习。
整体使用C语言代码实现,如下
#include<stdio.h>
#include<stdlib.h>
#define size 100      //顺序表存储空间的初始分配量
#define sizeincrement 10    //顺序表存储空间的分配增量
#define OK 1
#define ERROR 0
typedef struct{
     int * p;
	 int length;    
	 int listsize;
}List;
int InitList(List &L){     //初始化顺序表
     L.p=(int *)malloc(size*sizeof(int));
	 if(!L.p)
		 return ERROR;
	 L.length=0;
	 L.listsize=size;
	 return OK;


}
int ListWrite(List &L){        //构建顺序表
	int n,i,*q;
	q=L.p;
	printf("请输入数据个数:");
	scanf("%d",&n);
	printf("请输入数据:");
	for(i=0;i<n;i++){
		scanf("%d",q++);
		++L.length;
	}
	return OK;


}
void ListPrint(List &L){         //遍历后输出顺序表
   for(int i=0;i<L.length;i++)
	   printf("%d\t",L.p[i]);
   printf("\n");
}
int ListInsert(List &L){       //顺序表的插入
        int i,n,m;
        printf("请输入插入元素的位置:");
        scanf("%d",&i);
        if (i<1||i>L.length+1)
            return ERROR;
        if(L.length>=L.listsize){      //当前存储空间已满,增加分配
                L.p=(int *)realloc(L.p,(L.listsize+sizeincrement)*sizeof(int));    
            if(!L.p)
                exit(1);
            L.listsize+=sizeincrement;
        }
        printf("请输入所要插入的元素:");
        scanf("%d",&n);
        for(m=L.length-1;m>=i-1;m--)
            L.p[m+1]=L.p[m];
        L.p[i-1]=n;
        L.length++;
        return OK;


}
int ListDelete(List &L){     //顺序表的删除
    int i,m;
    printf("请输入要删除元素的位置:");
    scanf("%d",&i);
    if(i<1||i>L.length)
        return ERROR;
    for(m=i;m<L.length;m++)
        L.p[m-1]=L.p[m];
    L.length--;
    return OK;


}
int Listfind(List &L){      //顺序表的查找
     int i,m;
     printf("请输入所要查找的元素:");
     scanf("%d",&i);
     for(m=0;m<L.length;m++){
        if(L.p[m]==i){
          printf("存在,位置为%d\n",m+1);
          break;
       }
       if(m==L.length-1)
           printf("不存在\n");
    }
    return OK;


}
int Listupdate(List &L){      //顺序表的更新
     int i,m,e;
     printf("请输入要更改的数据:");
     scanf("%d",&i);
     printf("更改为:");
     scanf("%d",&e);
     for(m=0;m<L.length;m++){
        if(L.p[m]==i){
          L.p[m]=e;
          break;
       }
       if(m==L.length-1)
           printf("不存在\n");
    }
    return OK;
}
void menu(){
    printf("************************\n");
    printf("1.创建一个顺序表\n");
    printf("2.遍历顺序表\n");
    printf("3.查找顺序表元素\n");
    printf("4.插入元素\n");
    printf("5.删除元素\n");
    printf("6.更新元素\n");
    printf("0.结束\n");
    printf("************************\n");
    printf("请选择操作:\n");
}
int main(){
     List L0;
     InitList(L0);
     int i;
     menu();
     while(scanf("%d",&i)){
       switch(i){
         case 1:ListWrite(L0);break;
         case 2:ListPrint(L0);break;
         case 3:Listfind(L0);break;
         case 4:ListInsert(L0);break;
         case 5:ListDelete(L0);break;
         case 6:Listupdate(L0);break;
         case 0:return 0;
         default:printf("输入有误请重新输入");
        }
     }
	 return 0;
}





  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值