SeqList.h
#include "stdio.h"
#include "math.h"
//#define LISTSIZE 100
//typedef int DataType;
typedef struct {
DataType list[LISTSIZE];
int length;
}SeqList;
/******************************************************
C 语言中
结构体变量用 . 运算符来访问结构体的成员
指向结构体的指针用 -> 来访问其指向的结构体的成员
*******************************************************/
// 1 初始化顺序表,将顺序表的长度置为0
void InitList(SeqList *L) {
L->length = 0;
}
// 2 判断顺序表是否为空,为空返回1,不空返回0
int ListEmpty(SeqList L) {
if (L.length == 0)
return 1;
else
return 0;
}
// 3 按序号查找操作
int GetElem(SeqList L,int i,DataType *e) {
/*查找顺序表中第 i 个元素
查找成功将该值返回给 e ,并返回 1 ;否则返回 -1 ,表示失败*/
if (i<1 || i>L.length) //查找之前判断序号是否合法
return -1;
*e = L.list[i - 1]; //将第 i 个元素赋值给 e
return 1;
}
// 4 按内容查找操作
int LocateElem(SeqList L, DataType e) {
/*查找顺序表中元素值为 e 的元素
查找成功,将对应元素的序号返回;否则返回0,表示失败*/
int i;
for (i = 0; i < L.length; i++)
{
if (L.list[i] == e)
return i; //返回的序号要搞清楚,从0开始
}
return 0;
}
// 5 插入操作
/*
插入 i 长度j
序号 1 2 3 4 5 6 7 8 9 10
list[i-1] list[j-1] list[j]
list 0 1 2 3 4 5 6 7 8 9
*/
int InsertList(SeqList *L, int i, DataType e)
{
/*在顺序表的第 i 个位置插入 元素 e ,插入成功返回 1;
插入位置不和法,返回 -1;
顺序表满返回 0 */
int j;
if (i<1 || i > L->length + 1)
{
printf("插入位置不合法 !");
return -1;
}
else if (L->length >= LISTSIZE)
{
printf("顺序表已满不能插入 !");
return 0;
}
else
{
for (j = L->length; j >= i; j--)
L->list[j] = L->list[j - 1];
L->list[i - 1] = e; //插入元素到底 i 个位置
L->length =L->length + 1; //顺序表长度 +1
return 1;
}
}
// 6 删除操作
/*
删除 i 长度j
序号 1 2 3 4 5 6 7 8 9 10
list[i-1] list[j-1]
list 0 1 2 3 4 5 6 7 8 9
*/
int DeleteList(SeqList *L, int i, DataType *e)
{
int j;
if (i<1 || i>L->length)
{
printf("删除位置不合法!");
return -1;
}
else if (L->length <= 0) {
printf("顺序表已空,不能进行删除操作!");
return 0;
}
else
{
*e = L->list[i - 1]; //删除的值保存到 e 中,以防要用
for (j = i; j <= L->length - 1; j++)
L->list[j - 1] = L->list[j];
L->length = L->length - 1;
return 1;
}
}
// 7 获取长度
int ListLength(SeqList L) {
return L.length;
}
//清空操作
void ClearList(SeqList *L) {
L->length = 0;
}
例1:
利用顺序表的基本运算,实现如果在顺序表A中出现的元素,在顺序表B中也出现,则将A中该元素删除
#include <stdio.h> /*包含输入输出头文件*/
#include <stdlib.h> /* system("pause") VS编译调试 */
#define LISTSIZE 100
typedef int DataType;
#include "SeqList.h" /* 包含顺序表实现文件 */
void DelElem(SeqList *A, SeqList B);
void main() {
int i, j, flag;
SeqList A, B;
DataType e;
InitList(&A);
InitList(&B);
for (i = 1; i <= 10; i++) {
if (InsertList(&A, i, i) == 0)
{
printf("插入Seq A出错!");
return ;
}
}
for (i = 1, j = 1; j <= 6; i = i + 2, j++) {
if (InsertList(&B, j, i*2) == 0) {
printf("插入Seq B出错!");
return ;
}
}
printf("顺序表A中元素的顺序:\n");
for (i = 0; i <= A.length; i++) {
flag = GetElem(A, i, &e);
if (flag == 1)
printf("%4d", e);
}
printf("\n");
printf("顺序表B中元素的顺序:\n");
for (i = 0; i <= B.length; i++) {
flag = GetElem(B, i, &e);
if (flag == 1)
printf("%4d", e);
}
printf("\n");
printf("将在A中出现的B的元素删除后A中的元素:\n");
DelElem(&A,B);
for (int i = 0; i <= A.length; i++) {
flag = GetElem(A, i, &e);
if (flag == 1)
{
printf("%4d", e);
}
}
printf("\n");
system("pause");
}
//删除A中出现的B的元素
void DelElem(SeqList *A ,SeqList B)
{
int i,flag,pos;
DataType e;
DataType t;
for (i = 0; i <= B.length; i++) {
flag = GetElem(B, i, &e);
if (flag == 1)
{
pos = LocateElem(*A, e);
if (pos > 0) {
DeleteList(A, pos+1, &e); //pos+1 容易出现错误的地方
}
}
}
}
例2
顺序表A和顺序表B的元素都是非递减排列,利用顺序表的基本运算,将它们合并成一个顺序表C,要求C也是非递减排列。例如,A=(6,11,11,23),B=(2,10,12,12,21),则C=(2,6,11,11,12,12,21,23)。
#include <stdio.h>
#include <stdlib.h>
#define LISTSIZE 100
typedef int DataType;
#include "SeqList.h"
/*合并顺序表 A 和 B 到 C 的函数声明*/
void MergeList(SeqList A, SeqList B, SeqList *C);
void main() {
int i, flag;
DataType a[] = { 6,11,11,23 };
DataType b[] = { 2,10,12,12,21 };
DataType e;
SeqList A, B, C;
InitList(&A);
InitList(&B);
InitList(&C);
/* 数组 a 中的元素插入到顺序表 A 中 */
for (i = 1; i <= (sizeof(a) / sizeof(a[0])); i++) {
flag = InsertList(&A, i, a[i - 1]);
if (flag == 0) {
printf("插入位置非法!");
return;
}
}
/* 数组 b 中的元素插入到顺序表 B 中 */
for (i = 1; i <= (sizeof(b) / sizeof(b[0])); i++) {
flag = InsertList(&B, i, b[i - 1]);
if (flag == 0) {
printf("插入位置非法!");
return;
}
}
printf("顺序表A中的元素:\n");
for (i = 1; i <= A.length; i++) {
flag = GetElem(A, i, &e);
if (flag == 1)
printf("%4d", e);
}
printf("\n");
printf("顺序表B中的元素:\n");
for (i = 1; i <= B.length; i++) {
flag = GetElem(B, i, &e);
if (flag == 1)
printf("%4d", e);
}
printf("\n");
printf("将在A中出现B的元素合并后C中的元素:\n");
MergeList(A, B, &C);
for (i = 1; i <= C.length; i++) {
flag = GetElem(C, i, &e);
if (flag == 1) {
printf("%4d", e);
}
}
printf("\n");
printf(" C.Length:%4d", C.length);
printf("\n");
system("pause");
}
void MergeList(SeqList A, SeqList B, SeqList *C)
{
int i, j, k;
DataType e1, e2;
i = 1; j = 1; k = 1;
while (i <= A.length&&j <= B.length) {
GetElem(A, i, &e1); //取出顺序表 A 中的元素
GetElem(B, j, &e2); //取出顺序表 B 中的元素
if (e1 <= e2) {
InsertList(C, k, e1); //将较小的插入 C 中
i++; //往后移一个位置,准备比较下一个元素
k++;
}
else
{
InsertList(C, k, e2);
j++;
k++;
}
}
while (i <= A.length) //如果A中元素还有剩余,这时B中已经没有元素
{
GetElem(A, i, &e1);
InsertList(C, k, e1); //将A中剩余元素插入到C中
i++;
k++;
}
while (j <= B.length) //如果B中还有元素剩余,此时A中已经没有元素
{
GetElem(A, j, &e2);
InsertList(C, k, e2); //将B中剩余元素插入到C中
j++;
k++;
}
}
以上内容来自《跟我学数据结构》陈锐 葛丽萍编著,尊重作者,购买图书。