顺序表的操作
一、从顺序表中删除具有最小值的元素
/*
时间:2017年7月2日10:49:39
功能:从顺序表中删除具有最小值的元素并将最后元素放于被删除元素的位置,由函数返回被删元素的值
*/
#include "stdio.h"
#include "string.h"
#include"stdlib.h"
#define maxSize 15 //显式地定义表的长度
typedef int DataType; //定义表元素的数据类型
typedef struct //顺序表的定义
{
DataType data[maxSize]; //静态分配存储表元素的一维数组
int n; //实际表元素个数
}SeqList;
int deleteMin(SeqList*, DataType* ); //函数声明
int main()
{
SeqList L = {{11,21,3,41,31,21,4,6,8,7},10}; //顺序表元素初始化
DataType x;
deleteMin(&L, &x); //因为x的值会改变,故传入调用函数的是地址
printf("被删除的元素的值为:%d\n", x);
printf("完成相应操作后的数组形式:\n");
for(int i = 0; i < 9; i++)
printf("%d\t",L.data[i]); //此处L是结构体普通变量
printf("\n");
return 0;
}
int deleteMin(SeqList *L, DataType *x) //此处用指针接住地址变量的值
{
if(L->n == 0)
{
printf("表空不能删除!\n");
return 0;
}
int i, pos = 0; //假定0号元素的值最小
for(i = 2; i <= L->n; i++) //循环,寻找具有最小值的元素,此处的L是结构体指针变量
if(L->data[i-1] < L->data[pos]) //pos记忆当前具有最小值元素的位置
pos = i-1;
*x = L->data[pos];// L->n--; L->data[pos] = L->data[L->n];
return 1; //如果return的返回值返回到调用函数处,返回的值需要用一个变量进行存储
}
/*
总结:顺序表中的所有元素既可以顺序访问也可以随机访问
在VC++6.0中显示的结果是:
——————————————————————————————————
被删除的元素的值为:3
完成相应操作后的数组形式:
11 21 7 41 31 21 4 6 8
——————————————————————————————————
*/
二、将顺序表逆置
/*
2017年7月2日11:08:00
功能:将顺序表中的元素逆置
*/
#include "stdio.h"
#define maxSize 15 //显式地定义表的长度
typedef int DataType; //定义表元素的数据类型
typedef struct //顺序表的定义,此处只是定义了一个类型,这个类型是结构体类型=SeqList
{
DataType data[maxSize]; //静态分配存储表元素的一维数组
int n; //实际表元素个数
}SeqList; //注意:数组data[maxSize]和变量n都是结构体变量的成员,它们之间没有必然的联系
void Reverse(SeqList * );
int main()
{
SeqList L = {{11, 21, 3, 41, 31, 21, 4, 6, 8, 7},10} ; //顺序表元素初始化
Reverse( &L);
printf("数组逆置后的元素排列:\n");
for(int i = 0; i < L.n; i++)
printf("%d\t",L.data[i]);
printf("\n");
return 0;
}
void Reverse(SeqList *L)
{
if(L->n == 0)
{
printf("空表不需交换!\n");
}
DataType tmp;
for(int i = 1; i <= L->n/2; i++)
{
tmp = L->data[i-1];
L->data[i-1] = L->data[10-i];
L->data[10-i] = tmp;
}
}
/*
在VC++6.0中显示的结果:
————————————————————————————
数组逆置后的元素排列:
7 8 6 4 21 31 41 3 21 11
————————————————————————————
*/
三、在顺序表上的顺序查找算法
/*
时间:2017年7月2日13:17:12
功能:在顺序表上的顺序查找算法
*/
#include"stdio.h"
#define maxSize 15 //显式地定义表的长度
typedef int DataType; //定义表元素的数据类型
typedef struct //顺序表的定义,此处只是定义了一个类型,这个类型是结构体类型=SeqList
{
DataType data[maxSize]; //静态分配存储表元素的一维数组
int n; //实际表元素个数
}SeqList;
int seqSearch(SeqList &L,DataType x);
int main()
{
int x, k;
printf("请输入需要进行查找的元素:");
scanf("%d",&x);
SeqList L = {{2,5,6,4,8,7,3,5,8,9},10};
k = seqSearch(L, x);
if(k == 1 )
{
printf("在顺序表上找到了%d这个元素\n",x);
}
else
{
printf("在顺序表上不存在,没有找到\n");
}
return 0;
}
int seqSearch(SeqList &L,DataType x)
{
int i = 0;
while(L.data[i] != x) //从前向后顺序查找
i++;
if(i < 9)
return 1;
else
return 0;
}
与上面的算法有细微的区别:
/*
时间:2017年7月2日13:17:12
功能:在顺序表上的顺序查找算法
*/
#include"stdio.h"
#define maxSize 15 //显式地定义表的长度
typedef int DataType; //定义表元素的数据类型
typedef struct //顺序表的定义,此处只是定义了一个类型,这个类型是结构体类型=SeqList
{
DataType data[maxSize]; //静态分配存储表元素的一维数组
int n; //实际表元素个数
}SeqList;
int seqSearch(SeqList *L,DataType x);
int main()
{
int x, k;
printf("请输入需要进行查找的元素:");
scanf("%d",&x);
SeqList L = {{2,5,6,4,8,7,3,5,8,9},10};
k = seqSearch(&L, x);
if(k == 1 )
{
printf("在顺序表上找到了%d这个元素\n",x);
}
else
{
printf("在顺序表上不存在,没有找到\n");
}
return 0;
}
int seqSearch(SeqList *L,DataType x)
{
int i = 0;
while(L->data[i] != x) //从前向后顺序查找
i++;
if(i < 9)
return 1;
else
return 0;
}
/*
在VC++6.0中显示的结果是:
——————————————————————————
请输入需要进行查找的元素:3
在顺序表上找到了3这个元素
请输入需要进行查找的元素:1
在顺序表上不存在,没有找到
——————————————————————————
*/
四、在有序顺序表上查找算法
/*
时间:2017年7月2日13:26:40
功能:在有序顺序表上的顺序查找算法
*/
#include"stdio.h"
#define maxSize 15 //显式地定义表的长度
typedef int DataType; //定义表元素的数据类型
typedef struct //顺序表的定义,此处只是定义了一个类型,这个类型是结构体类型=SeqList
{
DataType data[maxSize]; //静态分配存储表元素的一维数组
int n; //实际表元素个数
}SeqList;
int seqSearch(SeqList &L,DataType x);
int main()
{
int x, k;
printf("请输入需要进行查找的元素:");
scanf("%d",&x);
SeqList L = {{2,3,4,5,6,7,8,9,10,11},10};
k = seqSearch(L, x);
if(k != -1 )
{
printf("在顺序表上找到了%d这个元素\n",x);
}
else
{
printf("在顺序表上不存在,没有找到\n");
}
return 0;
}
int seqSearch(SeqList &L,DataType x)
{
for(int i = 0; i < L.n; i++)
if(L.data[i] == x)
return i;
else
return -1;
}
/*
在VC++6.0中显示的结果为:
——————————————————————————————
请输入需要进行查找的元素:10
在顺序表上找到了10这个元素
请输入需要进行查找的元素:19
在顺序表上不存在,没有找到
——————————————————————————————
*/
五、从顺序表中删除第i个元素并由函数返回被删除元素的值
/*
时间:2017年7月2日13:38:56
功能:从顺序表中删除第i个元素并由函数返回被删元素的值
*/
#include "stdio.h"
#define maxSize 15 //显式地定义表的长度
typedef int DataType; //定义表元素的数据类型
typedef struct //顺序表的定义,此处只是定义了一个类型,这个类型是结构体类型=SeqList
{
DataType data[maxSize]; //静态分配存储表元素的一维数组
int n; //实际表元素个数
}SeqList;
int deleteNo_i(SeqList &L,int i,DataType *x);
int main()
{
int i, x;
printf("您想要删除数组中第几个元素: ");
scanf("%d",&i);
SeqList L = {{11, 21, 3, 41, 31, 21, 4, 6, 8, 7},10} ; //顺序表元素初始化
deleteNo_i( L, i, &x);
printf("被删除元素的值为:%d\n",x);
printf("完成操作之后数组的元素排列:\n");
for( int j = 0; j < L.n; j++)
printf("%d\t",L.data[j]);
printf("\n");
return 0;
}
int deleteNo_i(SeqList &L,int i,DataType *x)
{
if(L.n == 0)
{
printf("空表不需交换!\n");
return 0;
}
if(i <= 1 || i > L.n)
{
printf("i的值不合理!\n");
return 0;
}
*x = L.data[i-1]; L.n--;
for(int j = i; j <= L.n; j++)
L.data[j-1] = L.data[j];
return 1;
}
/*
在VC++6.0中显示的结果为:
——————————————————————————————————————
您想要删除数组中第几个元素: 5
被删除元素的值为:31
完成操作之后数组的元素排列:
11 21 3 41 21 4 6 8 7
——————————————————————————————————————
*/
六、向顺序表中第i个位置插入一个新的元素x
/*
时间:2017年7月2日13:39:14
功能:向顺序表中第i个位置插入一个新的元素x
*/
#include "stdio.h"
#define maxSize 15 //显式地定义表的长度
typedef int DataType; //定义表元素的数据类型
typedef struct //顺序表的定义,此处只是定义了一个类型,这个类型是结构体类型=SeqList
{
DataType data[maxSize]; //静态分配存储表元素的一维数组
int n; //实际表元素个数
}SeqList;
int InsNo_i(SeqList &L,int i,DataType x);
int main()
{
int i, x;
printf("您想要在数组中第几个元素进行插入: ");
scanf("%d",&i);
printf("请输入您要插入的元素的数值: ");
scanf("%d",&x);
SeqList L = {{11, 21, 3, 41, 31, 21, 4, 6, 8, 7},10} ; //顺序表元素初始化
InsNo_i( L, i, x);
printf("完成操作之后数组的元素排列:\n");
for( int j = 0; j < L.n; j++)
printf("%d\t",L.data[j]);
printf("\n");
return 0;
}
int InsNo_i(SeqList &L,int i,DataType x)
{
if(L.n == maxSize)
{
printf("表满不能插入!\n");
return 0;
}
if(i<1 || i>L.n+1)
{
printf("参数i不合理!\n");
return 0;
}
for(int j = L.n; j >= i; j--)
L.data[j] = L.data[j-1];
L.data[i-1] = x;
L.n++;
return 1;
}
/*
在VC++6.0中显示的结果为:
——————————————————————————————————————
您想要在数组中第几个元素进行插入: 5
请输入您要插入的元素的数值: 18
完成操作之后数组的元素排列:
11 21 3 41 18 31 21 4 6 8 7
——————————————————————————————————————
*/
七、从顺序表中删除具有给定值x的所有元素
/*
时间:2017年7月2日13:39:42
功能:从顺序表中删除具有给定值x的所有元素
*/
#include "stdio.h"
#define maxSize 15 //显式地定义表的长度
typedef int DataType; //定义表元素的数据类型
typedef struct //顺序表的定义,此处只是定义了一个类型,这个类型是结构体类型=SeqList
{
DataType data[maxSize]; //静态分配存储表元素的一维数组
int n; //实际表元素个数
}SeqList;
void deleteValue(SeqList &L, DataType &x);
int main()
{
int x;
printf("请输入您想要删除的元素: ");
scanf("%d",&x);
SeqList L = {{11, 21, 3, 3, 3, 21, 4, 6, 8, 7},10} ; //顺序表元素初始化
deleteValue( L, x);
printf("完成操作之后数组的元素排列:\n");
for( int j = 0; j < L.n; j++)
printf("%d\t",L.data[j]);
printf("\n");
return 0;
}
void deleteValue(SeqList &L, DataType &x)
{
int i, k = 0;
for(i = 0; i< L.n; i++)
if(L.data[i] != x)
{
if(i != k)
L.data[k] = L.data[i];
k++;
}
L.n = k;
}
/*
在VC++6.0中显示的结果为:
——————————————————————————————————————
请输入您想要删除的元素: 3
完成操作之后数组的元素排列:
11 21 21 4 6 8 7
——————————————————————————————————————
*/
八、顺序表中删除其值在给定值s与t之间的所有元素
/*
时间:2017年7月2日13:39:54
功能:顺序表中删除其值在给定值s与t之间的所有元素
*/
#include "stdio.h"
#define maxSize 15 //显式地定义表的长度
typedef int DataType; //定义表元素的数据类型
typedef struct //顺序表的定义,此处只是定义了一个类型,这个类型是结构体类型=SeqList
{
DataType data[maxSize]; //静态分配存储表元素的一维数组
int n; //实际表元素个数
}SeqList;
int deleteNo_sto_t(SeqList &L, DataType s, DataType t);
int main()
{
int s, t;
printf("请删除给定值之间的所有元素: ");
scanf("%d %d",&s,&t);
SeqList L = {{11, 21, 3, 41, 31, 21, 4, 6, 8, 7},10} ; //顺序表元素初始化
deleteNo_sto_t( L, s, t);
printf("完成操作之后数组的元素排列:\n");
for( int j = 0; j < L.n; j++)
printf("%d\t",L.data[j]);
printf("\n");
return 0;
}
int deleteNo_sto_t(SeqList &L, DataType s, DataType t)
{
if(L.n == 0)
{
printf("表空不能删除!\n");
return 0;
}
if(s > t)
{
DataType tmp = s; s= t; t = tmp;
}
int i, k = 0;
for(i = 0; i< L.n; i++)
if(L.data[i]<s||L.data[i]>t)
{
if(k != i)
L.data[k] = L.data[i];
k++;
}
L.n = k;
return 1;
}
/*
在VC++6.0中显示的结果为:
——————————————————————————————————————
请删除给定值之间的所有元素: 3 11
完成操作之后数组的元素排列:
21 41 31 21
——————————————————————————————————————
*/
九、顺序表中删除其值在给定s与t之间的所有元素
/*
时间:2017年7月2日13:40:14
功能:有序顺序表中删除其值在给定s与t之间的所有元素
*/
#include "stdio.h"
#define maxSize 15 //显式地定义表的长度
typedef int DataType; //定义表元素的数据类型
typedef struct //顺序表的定义,此处只是定义了一个类型,这个类型是结构体类型=SeqList
{
DataType data[maxSize]; //静态分配存储表元素的一维数组
int n; //实际表元素个数
}SeqList;
int deleteNo_sto_t1(SeqList &L, DataType s, DataType t);
int main()
{
int s, t;
printf("您想要删除给定值之间所有的元素: ");
scanf("%d %d",&s,&t);
SeqList L = {{11, 21, 31, 41, 41, 41, 42, 64, 87, 97},10} ; //顺序表元素初始化
deleteNo_sto_t1( L, s, t);
printf("完成操作之后数组的元素排列:\n");
for( int j = 0; j < L.n; j++)
printf("%d\t",L.data[j]);
printf("\n");
return 0;
}
int deleteNo_sto_t1(SeqList &L, DataType s, DataType t)
{
if(L.n == 0)
{
printf("表空不能删除!\n");
return 0;
}
if(s > t)
{
DataType tmp = s;
s = t;
t = tmp;
}
int i, j, u, v;
for(i = 0; i < L.n && L.data[i] < s; i++);
if(i >= L.n)
{
printf("所有元素的值都小于s!\n");
return 0;
}
for(j = i; j < L.n && L.data[j] <= t; j++);
for(v = j, u = i; v < L.n; v++,u++)
L.data[u] = L.data[v];
L.n = L.n-j+i;
return 1;
};
/*
在VC++6.0中显示的结果为:
——————————————————————————————————————
您想要删除给定值之间所有的元素: 10 46
完成操作之后数组的元素排列:
64 87 97
——————————————————————————————————————
*/
十、有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不相同
/*
时间:2017年7月2日13:40:35
功能:有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不相同
*/
#include "stdio.h"
#define maxSize 15 //显式地定义表的长度
typedef int DataType; //定义表元素的数据类型
typedef struct //顺序表的定义,此处只是定义了一个类型,这个类型是结构体类型=SeqList
{
DataType data[maxSize]; //静态分配存储表元素的一维数组
int n; //实际表元素个数
}SeqList;
int deleteSame(SeqList &L);
int main()
{
SeqList L = {{11, 21, 31, 41, 41, 41, 42, 64, 87, 97},10} ; //顺序表元素初始化
deleteSame( L);
printf("完成操作之后数组的元素排列:\n");
for( int j = 0; j < L.n; j++)
printf("%d\t",L.data[j]);
printf("\n");
return 0;
}
int deleteSame(SeqList &L)
{
if(L.n == 0)
return 0;
int i, k = 0, m;
for(int j = 0; j < L.n; j++)
{
for(i = j+1; i < L.n; i++)
{
if(L.data[j] == L.data[i] )
{
m = 0;
break;
}
else
m = 1;
}
if(m == 1)
L.data[k++] = L.data[j];
}
L.n = k;
return 0;
}
/*
在VC++6.0中显示的结果为:
——————————————————————————————————————
完成操作之后数组的元素排列:
11 21 31 41 42 64 87 97
——————————————————————————————————————
*/