1.1线性表的顺序表示与实现
线性表的顺序存储指的是将线性表中的元素存放在一组连续的存储单元中,这样使得在逻辑上是相邻的,物理存储上也是相邻的。采用顺序存储结构的线性表称为顺序表。
顺序表反应了线性表中元素的逻辑关系,只要知道第一个元素的存储地址就能得到线性表中任何一个元素的存储地址。同样已知任何一个元素的存储地址都可以得到其他元素的存储地址。因此线性表中的任何一个元素都可以随机存取,线性表的顺序存储结构是一种随机存取的存储结构。
问题:如果A中的元素在B中出现过,将A中的删除。
解决:
头文件
#pragma once
#include <stdio.h>
#include <stdlib.h>
#define LISTSIZE 100
typedef int DataType;
typedef struct {
DataType list[LISTSIZE];
int length;
}SeqList;
//顺序表初始化
void InitList(SeqList* L)
{
L->length = 0;
}
//判断顺序表是否为空
int ListEmpty(SeqList L)
{
if (L.length == 0)
return 1;
else
return 0;
}
//获取第i个元素,用e接收
int GetElem(SeqList L, int i, DataType* e)
{
if (i<1 || i>L.length)
return -1;
*e = L.list[i - 1];
return 1;
}
//查找与e相等的元素
int LocateElem(SeqList L, DataType e)
{
for (int i = 0; i < L.length; i++)
{
if (e == L.list[i])
return i + 1;
}
return 0;
}
//在第i个位置插入新元素e
int InsertList(SeqList* L, int i, DataType e)
{
if (i<1 || i>L->length + 1)
return -1;
else if (L->length == LISTSIZE)
return 0;
else
{
for (int j = L->length; j >= i; j--)
L->list[j] = L->list[j - 1];
L->list[i - 1] = e;
L->length++;
return 1;
}
}
//删除第i个元素
int DeleteList(SeqList* L, int i, DataType* e)
{
if (L->length <= 0)
return 0;
else if (i<1 || i>L->length)
return -1;
else
{
*e = L->list[i - 1];
for (int j = i; j <= L->length - 1; j++)
L->list[j - 1] = L->list[j];
L->length--;
return 1;
}
}
//返回线性表的长度
int ListLength(SeqList L)
{
return L.length;
}
//清空线性表
void ClearList(SeqList* L)
{
L->length = 0;
}
测试文件
#include <stdio.h>
#include <stdlib.h>
#include "SeqList.h"
//删除 A在B中出现的元素
void DelElem(SeqList* A, SeqList* B);
void main()
{
SeqList A, B;
int i, j;
DataType e;
InitList(&A);
InitList(&B);
for (int i = 1; i <=10; i++)
{
if (InsertList(&A, i, i) == 0)
{
printf("插入位置不合法");
return;
}
}
for (i = 1,j = 1;j<=6;i=i+2,j++)
{
if (InsertList(&B, j, 2*i) == 0)
{
printf("插入位置不合法");
return;
}
}
printf("顺序表A的元素:\n");
for (i = 1; i <= A.length; i++)
{
if (GetElem(A, i, &e)==1)
printf("%4d",e);
}
printf("\n");
printf("顺序表B的元素:\n");
for (i = 1; i <= B.length; i++)
{
if (GetElem(B, i, &e) == 1)
printf("%4d", e);
}
printf("\n");
printf("将在A中出现B的元素删除后A中的元素:\n");
DelElem(&A, &B);
for (i = 1; i <= A.length; i++)
{
if (GetElem(A, i, &e) == 1)
printf("%4d", e);
}
printf("\n");
}
void DelElem(SeqList* A, SeqList* B) {
int pos;
DataType e;
int i;
for (i = 0; i <=B->length; i++)
{
if (GetElem(*B, i, &e) == 1)
{
pos = LocateElem(*A, e);
if (pos > 0)
DeleteList(A, pos, &e);
}
}
}