数据结构c语言之线性表(1)——顺序存储线性表(源码奉上)

线性表存储结构建立工程实现线性表功能

特别注意事项:注意看每个包的头文件的声明
	    头文件能包含.h头文件,但是不能包含.c头文件,这是值得注意的地方

①将函数结果状态声明写在status.h包内

//status.h

#ifndef STATUS_H
#define STATUS_H
#define   TRUE    1
#define   FALSE   0
#define   OK    1
#define    ERROR    0
#define    INFEASIBLE   -1
#define   OVERFLOW   -2
typedef    int   Status;
typedef int ElemType;
#endif

②将函数声明写在list.h包内

//list.h

#ifndef LIST_H
#define LIST_H
#include "status.h"
#define LIST_INIT_SIZE 100
#define LISTINCREAMENT 20
 typedef  struct{
  ElemType  *elem;         //指向存放线性表中数据元素的基地址,即存放动态数组的首地址 
  int  length;          //线性表的当前长度 即元素的个数  
    int  listsize;        //当前分配的存储容量                                           
  }SqList;


Status InitList (SqList *L);//构造一个空线性表
int ListLength(SqList  L);//求线性表的长度
int IsEmpty(SqList  L);//判断线性表是否为空
int GetElem(SqList L,int i,ElemType *e);//获取线性表第i位置的元素
int LocateELem(SqList  L,ElemType e);//查询数据元素e,返回其位置
Status ListInsert(SqList *L,int i,ElemType e);//在线性表第i位置插入元素e
Status ListDelete(SqList *L,int i,ElemType *e);//删除线性表中第i位置的元素
#endif  //必须要有,这是终止程序的条件

③将函数的定义写在list.c包内

#include <stdio.h>
#include "list.h"

Status InitList (SqList *L)//构造一个空线性表
{
//动态开辟内存空间,即为elem赋值malloc NULL(没有连续的内存)
//当前长度为0
//动态数组的容量
   L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
   if(L->elem==NULL)
   {
    return ERROR;
   }
   L->length=0;
   L->listsize=LIST_INIT_SIZE;
   return OK; 
}



int ListLength(SqList  L)//求线性表的长度
{
  return L.length;
}



int IsEmpty(SqList  L)//判断线性表是否为空
{
 if(L.length==0)
  return TRUE;
 else
  return FALSE;
}




int GetElem(SqList L,int i,ElemType *e)//获取线性表第i位置的元素
{
 if(L.length==0||i<1||i>(L.length)) 
 return ERROR;
 *e=L.elem[i-1];
 return OK;
}



int LocateELem(SqList  L,ElemType e)//查询数据元素e,返回其位置
{
  int i;    
  if (L.length==0)            
  return ERROR;    
  for(i=0;i<L.length;i++)    
  {            
  if (L.elem[i]==e)                    
  break;    
     }    
   if(i==L.length)            
       return ERROR;     
    return i+1;
}



Status ListInsert(SqList *L,int i,ElemType e)//在线性表第i位置插入元素e
{
 int k;
 if(L->length==LIST_INIT_SIZE)//如果线性表内存已被占据满,则不能够再插入元素 
 return ERROR;
 if(i<1||i>(L->length+1))//i传来的是位置,从1开始的,因为顺序线性表是连续的,所以插入的位置不能比线性表的最后一位的后一位还要大 
 return ERROR;
 if(i<=L->length)//当线性表还没有满的时候,可以插入,此时插入的位置不包含表尾
 for(k=L->length;k>=i;k--)
 L->elem[k]=L->elem[k-1];//将要插入位置之后的所有数据元素向后移动一位 (注意:此时利用的是指针的下标,从0开始的)
 L->elem[i-1]=e;//将新元素插入到i位置上 
 L->length++; 
 return OK; 
}




Status ListDelete(SqList *L,int i,ElemType *e)//删除线性表中第i位置的元素
{
 int k; 
    if (L->length==0)//长度为0,代表没有元素,就不能进行删除操作 
 return ERROR;
    if (i<1 || i>L->length)//删除的元素的位置一定不能比线性表中的元素的个数多或少 
    return ERROR;
    *e=L->elem[i-1];//存放要删除的元素,用于返回删除的数,所以必须是指针型,若不是指针型那么e只在该范围中起作用
 if (i<L->length)//如果删除的不是表尾的元素   
  for(k=i;k<L->length;k++)//将删除位置后面的元素都向前移    
 L->elem[k-1]=L->elem[k];      
  L->length--;//当删除的是表尾的时候,长度直接减小1,所以表为元素不会输出来  
  return OK;
}

④将main函数实现线性表的功能写在status.c包内

#include "list.h"
#include <stdio.h>
int main()
{
 SqList sqlist;
 SqList *L=&sqlist;
 ElemType value;
 int t,i,n,site;


printf("==================构造空线性表=================="); 
 t=InitList(L);//正确,L作为实参,有确定的值
 if(t==OK)
 {
  printf("\n线性表长度为:%d\n线性表当前的存储容量为:%d\n",L->length,L->listsize); 
 }
 //InitList(&sqlist); 
 //SqList *L;
 //InitList(L);//错误,L没有确定的值


printf("==================求线性表长度=================="); 
 printf("\n此时线性表的长度为:%d\n",ListLength(sqlist));


printf("==================判断线性表是否为空==================");
 t=IsEmpty(sqlist);
 if(t==TRUE)
 printf("\n此时线性表为空\n");
 else
 printf("\n此时线性表并不为空\n");


 printf("==================为线性表添加数据==================");
 printf("\n请输入你要添加数据的个数:");
 scanf("%d",&n); 
 printf("请依次输入%d个数据:",n);
 for(i=1;i<=n;i++)
 {
  scanf("%d",&value);
  ListInsert(L,i,value);
 }
 printf("插入数据后的线性表中的数据为:");
 for(i=0;i<L->length;i++)
 printf("%d ",L->elem[i]);




 printf("\n==================在线性表第i位置插入元素==================");
 printf("\n请输入你要插入元素的位置和所要插入的数:");
 scanf("%d %d",&site,&value);
 ListInsert(L,site,value);
 printf("插入数据后的线性表中的数据为:");
 for(i=0;i<L->length;i++)
 printf("%d ",L->elem[i]);




 printf("\n==================删除线性表中第i位置的元素,并返回所删除的元素==================");
 printf("\n请输入你要删除元素的位置:");
 scanf("%d",&site); 
 t=ListDelete(L,site,&value);
 if(t==ERROR)
 printf("你删除的数不在范围子内");
 else{
 printf("你删除的第%d个元素的值为:%d\n",site,value); 
 printf("删除数据后的线性表中的数据为:"); 
 for(i=0;i<L->length;i++)
 printf("%d ",L->elem[i]);
 } 




 printf("\n==================获取线性表第i位置的元素==================");
 printf("\n请输出你要获取元素的位置:");
 scanf("%d",&site); 
 t=GetElem(sqlist,site,&value);
 if(t==ERROR)
 printf("你输入的获取元素的位置不正确");
 else
 printf("你所获取的第%d个元素为:%d",site,value);





 printf("\n==================查询数据元素value,返回其位置==================");
 printf("\n请输入你要查询的数据:");
 scanf("%d",&value);
 t=LocateELem(sqlist,value);
 if(t==ERROR)
 printf("抱歉,未找到查询结果");
 else
 printf("你所查询的元素“%d”已找到,位置为:%d\n",value,t);
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱睡觉的小馨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值