1、掌握线性表的顺序存储实现方法;
描述
用顺序存储的方式(数组)实现线性表的MakeEmpty()、Find()、Insert()、Delete()、Length()等操作。
输入
输入第1行是一个整数n,表示之后还有n行输入。每行输入表示对线性表的一条操作指令,格式是“指令编号 参数1 参数2(如有)”。指令编号为1,表示Insert操作,此时参数1为插入的元素值,参数2为所插入元素在线性表中的位序。指令编号为2,表示Delete操作,此时只有一个参数,即待删除元素在线性表中的位序。指令编号为3,表示Find操作,此时只有一个参数,即待查元素的值。
输出
对于Insert和Delete操作,无论是否成功都没有输出(注意:此处与视频讲解不同)。对于Find操作,每次都输入查找结果,如果找到则输出该元素下标,如果没找到则输出-1,之后要换行。所有指令执行完成之后,从头至尾输出线性表中的所有元素,元素之间用1个空格隔开。
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 50
typedef int ElementType;
typedef int Position;
typedef struct LNode * List;
struct LNode
{
ElementType Data[MAXSIZE];
Position Last;
};
List MakeEmpty()
{
List L;
L=(List)malloc(sizeof(List));
L->Last = -1;
return L;
}
int Find(List L,ElementType x)
{
Position i = -1;
while(i<=L->Last && L->Data [i] != x)
i++;
if(i>L->Last )
return -1;
else
return i;
}
List Insert(List L,ElementType x,int i)
{
Position j;
if(L->Last == MAXSIZE-1)
{
//printf("表满\n");
return NULL;
}
if(i<1 || i > L->Last +2)
{
//printf("位序不合法\n");
return NULL;
}
for(j=L->Last ; j>=i-1; j--)
L->Data [j+1] = L->Data [j];
L->Data [i-1] = x;
L->Last ++;
return L;
}
List Delete(List L,int i)
{
Position j;
if(i<1 || i> L->Last+1)
{
//printf("位序%d不存在元素\n",i);
return NULL;
}
for(j=i;j<=L->Last ;j++)
L->Data [j-1] = L->Data [j];
L->Last --;
return L;
}
int Length(List L)
{
return L->Last+1;
}
int main()
{
List L = MakeEmpty();
int n,op;
Position i;
ElementType x;
scanf("%d",&n);
while(n--)
{
scanf("%d",&op);
switch(op)
{
case 1: scanf("%d%d",&x,&i);
Insert(L,x,i); break;
case 2: scanf("%d",&i);
Delete(L,i); break;
case 3: scanf("%d",&x);
printf("%d\n",Find(L,x)); break;
}
}
for(int j=0; j<=L->Last ;j++)
printf("%d ",L->Data [j]);
return 0;
}
2、掌握线性表的链式存储实现方法。
描述
用链式存储的方式(链表)实现线性表的MakeEmpty()、Find()、Insert()、Delete()、Length()等操作。
输入
输入第1行是一个整数n,表示之后还有n行输入。每行输入表示对线性表的一条操作指令,格式是“指令编号 参数1 参数2(如有)”。指令编号为1,表示Insert操作,此时参数1为插入的元素值,参数2为所插入元素在线性表中的位序。指令编号为2,表示Delete操作,此时只有一个参数,即待删除元素在线性表中的位序。本题只进行插入或删除操作,不进行查找操作。
输出
对于Insert和Delete操作,无论是否成功都没有输出(注意:此处与视频讲解不同)。所有指令执行完成之后,从头至尾输出线性表中的所有元素,元素之间用1个空格隔开。
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode * PtrToLNode;
typedef PtrToLNode List;
typedef int ElementType;
struct LNode
{
ElementType Data;
PtrToLNode Next;
};
List MakeEmpty()
{
List L;
L=(List)malloc(sizeof(List));
L->Next = NULL;
return L;
}
int Length(List L)
{
List p;
int cnt=0;
p = L->Next ;
while(p)
{
p = p->Next ;
cnt++;
}
return cnt;
}
List Find(List L, ElementType x)
{
List p = L->Next ;
while(p && p->Data != x)
p=p->Next ;
if(p)
return p;
else
return NULL;
}
List Insert(List L, ElementType x, int i)
{
List temp,pre;
int cnt=0;
pre=L;
while(pre && cnt<i-1)
{
pre=pre->Next ;
cnt++;
}
if(pre==NULL || cnt!=i-1)
return NULL;
else
{
temp=(List)malloc(sizeof(List));
temp->Data = x;
temp->Next = pre->Next ;
pre->Next = temp;
return L;
}
}
List Delete(List L, int i)
{
List pre;
int cnt=0;
pre=L;
while(pre && cnt<i-1)
{
pre=pre->Next ;
cnt++;
}
if(pre==NULL || cnt!=i-1 || pre->Next ==NULL)
return NULL;
else
{
pre->Next = pre->Next ->Next;
return L;
}
}
int main()
{
List L = MakeEmpty();
List p=L->Next ; //
int n,op,i,x;
scanf("%d",&n);
while(n--)
{
scanf("%d",&op);
switch(op)
{
case 1: scanf("%d%d",&x,&i);
Insert(L,x,i); break;
case 2: scanf("%d",&i);
Delete(L,i); break;
}
}
//printf("%d\n",Length(L));
p=L->Next ;
while(p)
{
printf("%d ",p->Data);
p=p->Next;
}
return 0;
}