顺序表:内存中的一块连续区域,紧密排列了若干个相同类型的数据。
故,必须事先知道元素有多少个,不然就无法开出合适的内存区域。
对于线性表的"."and"->"
在c语言中,->是指针操作符,.是结构操作符,如果L是一个结构实例的指针,用->,如果是一个结构的实例,用.
L为线性表时,调用*L表示线性表的第一个元素,而调用&L表示线性表的首地址
类型名称:线性表(List)
数据对象集:线性表是 n (≥0)个元素构成的有序序列( a1, a2, ...,an ) 线性表基本操作主要有:
1、List MakeEmpty():初始化一个空线性表L;
2、ElementType FindKth( int K, List L ):根据位序K,返回相应元素 ;
3、int Find( ElementType X, List L ):在线性表L中查找X的第一次出现位置;
4、void Insert( ElementType X, int i, List L):在位序i前插入一个新元素X;
5、void Delete( int i, List L ):删除指定位序i的元素;
6、int Length( List L ):返回线性表L的长度n。
```
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode *List;
typedef int ElementType;
typedef 100 MAXSIZE;
struct LNode{
ElementType Data[MAXSIZE];
int Last;
};
struct LNode L; //L.Data[i]
List PtrL; //PtrL->Data[i]
/*
**函数名: List MakeEmpty();
**作 用: 初始化一个空线性表L;
**形 参: 无;
**返回值: PtrL;
*/
List MakeEmpty(void) //初始化空间
{
List PtrL;
PtrL=(List)malloc(sizeof(struct LNode));//void *表示未确定类型的指针。可强转为任何其他类型的的指针。
PtrL->Last=-1;
return PtrL;
}
/*
**函数名: int Find(ElementType K,List PtrL);
**作 用: 在线性表L中查找X的第一次出现位置
**形 参: int K, List PtrL;
**返回值: 位置i;
*/
int Find(ElementType K,List PtrL) //查找
{
int i=0
while(i<=PtrL->Last && PtrL->Data[i]!=K);
i++;
if(i>PtrL->Last) return -1
else return i;
}
/*
**函数名:ElementType FindKth( int K, List L );
**作 用: 根据位序K,返回相应元素;
**形 参: int K,List PtrL;
**返回值: PtrL->Data[K]
*/
ElementType FindKth( int K, List PtrL)
{
while(K<=PtrL->Last && K>=0);
return PtrL->Data[K];
}
/*
**函数名: void Insert(ElementType K,int i,List PtrL);
**作 用: 根据位置i来插入参数K;
**形 参: ElementType K,int i,List Ptrl;
**返回值: PtrL;
*/
void Insert(ElementType K,int i,List Ptrl) //插入
{
if(PtrL->Last==MAXSIZE-1){
printf("线性表满");
return;
}
if(i<1||i>Ptrl->Last+2){
printf("插入位置不合法");
return;
}
for(j=PtrL->Last;j>i-1;j--){
PtrL->Data[j+1]=PtrL->Data[j]
}
PtrL->Data[i+1]=K;
PtrL->Last++;
}
/*
**函数名: void Delete( int i, List PtrL )
**作 用: 删除指定位序i的元素;
**形 参: int i, List PtrL
**返回值:
*/
void Delete( int i, List PtrL)
{
int j;
if(i>1 || i<=PtrL->Last+1){
for(j=i;j<=PtrL->Last;j++){
PtrL->Data[j-1]=PtrL->Data[j];
}
PtrL->Last--;
}else{
return;
}
}
/*
**函数名: int Length( List L );
**作 用: 返回线性表L的长度n;
**形 参: List PtrL
**返回值:
*/
int Length(List PtrL){
//return sizeof(PtrL)/ElementType;
return PtrL->Last+1;
}
```
<pre>
ss
</pre>
第二种是我刚写的
不多说,直接上code
```
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define listincreament 10 //存储空间分配增量
typedef struct{
int *elem; //存储空间基址 (末尾)
int length;//当前长度
int listsize;// 当前分配的存储容量
} SqList;
//构造一个空的线性表(初始化)
int InitList_Sq(SqList *L)
{
//动态分配空间
L->elem=(int *)malloc(80*sizeof(int));
//存储分配失败
if(!L->elem)
exit(OVERFLOW);
//存储分配成功
//初始化长度为零
L->length=0;
//存储的初始容量为初始分配空间
L->listsize=80;
return OK;
}
//n为要插入的位置
int Input_Sq(SqList *L,int n)
{
int i ,*newbase;
if(n<0)
return ERROR;
if(n>L->listsize)
{
newbase=(int *)malloc(listincreament*sizeof(int));
if(!newbase){
exit(OVERFLOW);
}
L->elem=newbase;
L->length+=listincreament;
}
printf("请输入元素:\n");
for(i=0;i<n;i++)
{
scanf("%d",&L->elem[i]);
L->length++;
}
return OK;
}
//i为位置,并非下标,e为要插入的新元素
int ListInsert_Sq(SqList *L,int i,int e){
//i需要满足1<=i<=ListLength_Sq(L)+1
int *newbase;
int *p;
int *q;//插入的位置
int j;
//判断输入
if(i<1||i>L->length+1)
return ERROR;
//判断线性表是否已满
if(L->length>=L->listsize)//满,(鲁棒性)(扩展)是否动态增加空间?
{
/*newbase=(int *)realloc((L->listsize+listincreament)*sizeof(int));
if(!newbase)
exit(OVERFLOW);//分配失败
*/
for(j=0;j<L->length;j++)
{
newbase[j]=L->elem[j];
}
L->elem=newbase;//新基址
L->length+=listincreament;//增加存储容量
}
q=&(L->elem[i-1]);
for(p=&(L->elem[L->length+1]);p>=q;p--)//元素后移
*(p+1)=*p;
*q=e; //插入
L->length+=1;//表长加1
return L->length;//返回表长
}
int Output_Sq(SqList *L,int i)
{
int j;
printf("更新后的线性表为:\n");
for(j=0;j<i;j++)
printf("%d\t",L->elem[j]);
return OK;
}
//在顺序线性表删除第i个元素,用e返回其值
int Delete_Sq(SqList *L,int i,int e)
{
int *q;
//先检查i的合法性
if(i<1||i>L->length)
return ERROR;
e=L->elem[i-1];//被删除的元素赋给e,之后用作返回
int *p=&L->elem[i-1]; //指针p为被删除元素的位置
for(q=p+1;q<=p+(L->length);q++)
*(q-1)=*q;
L->length-=1;
return OK;
}
int main(void)
{
SqList MyL;
char a,yn;
a='Y';
int k,data,position,*e;
InitList_Sq(&MyL);
printf("请输入元素个数:");
scanf("%d",&k);
Input_Sq(&MyL,k);
Output_Sq(&MyL,k);
while(a=='Y')
{
printf("\n请输入要插入的元素:");
scanf("%d",&data);
printf("\n请输入要插入的位置:");
scanf("%d",&position);
ListInsert_Sq(&MyL,position,data);
//printf(&MyL.length);
Output_Sq(&MyL,k+1);
printf("\n请输入要删除的元素的位置:");
scanf("%d",&position);
Delete_Sq(&MyL,position,e);
Output_Sq(&MyL,k);
printf("\n请问是否继续(Y or N)?:");
getchar();
scanf("%c",&a);
}
system("pause");
return OK;
}
```
效果如下