关于C语言处理顺序表的一些基本算法
1、初始化顺序表
2、判断为空
3、求顺序表表长
4、打印链表
5、删除或插入指定位置的元素
6、获得指定位置的元素
7、定位元素
8、删除指定值元素
9、删除某一数值范围的元素
10、删除重复元素
11、合并顺序表
12、逆置表
13、移动元素是得奇数元素在顺序表前
14、移动元素使得奇数元素在奇数位,偶数元素在偶数位
#include<stdio.h>
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE -1
#define MAXSIZE 20
typedef int Status;
typedef int ElemType;
typedef struct List {
ElemType data[MAXSIZE];
ElemType length;
}SqList;
void initList(SqList& L);
int isEmpty(SqList L);
int listLength(SqList& L);
void printList(SqList L);
Status listDelete(SqList& L, ElemType i, ElemType& e);
Status listInsert(SqList& L, ElemType i, ElemType e);
Status getElem(SqList L, ElemType i);
Status locateElem(SqList L, int x);
int delete_x(SqList& L, int x);
int deleteStoT(SqList& L, int s, int t);
int delete_repeate(SqList& L);
int merge_list(SqList A, SqList B, SqList& C);
int reverse(SqList& L, int n, int m);
int move1(SqList &L);
int move2(SqList &L);
int main() {
int n, a, index, e, local, x;
int m1, n1;
SqList L1, L2, L3;
initList(L1); //初始化链表
initList(L2);
initList(L3);
printf("输入表长及元素:\n"); //创建链表
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &L1.data[i]);
L1.length++;
}
printList(L1);
// printf("请输入需要逆置的位置");
// scanf("%d %d", &n1, &m1);
// reverse(L1, n1, m1);
move2(L1);
printList(L1);
//printf("输入表长及元素:\n"); //创建链表
//scanf("%d", &n);
//for (int j = 0; j < n; j++) {
// scanf("%d", &L2.data[j]);
// L2.length++;
//}
// printf("输入需要删除元素的序号 :\n"); //删除元素
// scanf("%d",&index);
// if(listDelete(L,index,e)==1)
// printf("OK\n");
// else
// printf("ERROR\n");
// printf("表长:%d\n",listLength(L));
// printList(L);
//
// printf("输入需要插入的元素位置:\n"); //插入元素
// scanf("%d",&index);
// printf("输入需要插入的元素:\n");
// scanf("%d",&a);
// listInsert(L,index,a);
// printf("表长:%d\n",listLength(L));
// printList(L);
//
// printf("输入需要查找的元素位置:\n"); //查找元素
// scanf("%d",&index);
// printf("对应位置的元素是 %d\n",getElem(L,index));
// printf("表长:%d\n",listLength(L));
// printList(L);
//
// printf("输入需要查找元素的值:\n"); //定位元素
// scanf("%d",&a);
// local=locateElem(L,a);
// if(local==-1)
// printf("元素不存在\n");
// else
// printf("The order in which the element is located is元素在链表中的位置是:%d",local);
// printf("%d\n",listLength(L));
// printList(L);
// printf("输入需要删除指定元素的值x:\n"); //定位元素
// scanf("%d",&x);
// delete_x(L,x);
// printf("%d\n",listLength(L));
// printList(L);
//
// int s,t;
// printf("输入需要删除指定区间元素的值:\n"); //定位元素
// scanf("%d %d",&s,&t);
// deleteStoT(L,s,t);
// printf("%d\n",listLength(L));
// printList(L);
//
// delete_repeate(L);
// printf("删除重复值之后的链表:\n");
// printf("%d\n",listLength(L));
// printList(L);
//merge_list(L1, L2, L3);
//printList(L3);
return 0;
}
void initList(SqList& L) { //初始化链表
L.length = 0;
//void initList(SqList L){
// L.length=0;
// return L;
//}
//void initList(SqList* L){
// L->length=0; //or (*L).length=0;
//}
}
int isEmpty(SqList L) { //判断是否为空
if (L.length == 0) {
return 1;
}
else
return -1;
}
int listLength(SqList& L) { //返回表长
return L.length;
}
void printList(SqList L) { //打印顺序表
int j;
//ElemType *p=null; //链表打印
// p=L.data[0];
// for(;p<(L.data+L.length);p++){
// printf("%d",*p);
// }
printf("List:");
if (L.length == 0) {
printf("List is empty表为空\n");
}
else {
for (j = 0; j < L.length; j++) {
printf("%d-", L.data[j]);
}
printf("\n");
}
}
Status listDelete(SqList& L, ElemType i, ElemType& e) { //删除元素
int j;
e = L.data[i - 1];
if (i<1 || i>L.length) { //wrongful不合法
return -1;
}
if (i < L.length) {
for (j = i; j <= L.length - 1; j++) {
L.data[j - 1] = L.data[j];
}
}
L.length--;
return TRUE;
}
//删除值为X的元素
int delete_x(SqList& L, int x) {
int count = 0;
for (int i = 0; i < L.length; i++) {
if (L.data[i] == x)
count++;
else {
L.data[i - count] = L.data[i];
}
}
L.length = L.length - count;
return true;
}
//删除在区间s-t之间的元素
int deleteStoT(SqList& L, int s, int t) {
int count = 0;
for (int i = 0; i < L.length; i++) {
if (L.data[i] >= s && L.data[i] <= t) {
count++;
}
else {
L.data[i - count] = L.data[i];
}
}
L.length = L.length - count;
return true;
}
//删有序表所有值重复的元素
int delete_repeate(SqList& L) {
int count = 0;
for (int i = 1; i < L.length; i++) {
if (L.data[i] == L.data[count])
continue;
else {
count++;
L.data[count] = L.data[i];
}
}
L.length = count + 1;
return true;
}
//两个递增有序表合并成一个递增有序表
int merge_list(SqList A, SqList B, SqList& C) {
int i = 0;
int j = 0;
int k = 0;
while (i < A.length && j < B.length) {
if (A.data[i] <= B.data[j])
C.data[k++] = A.data[i++];
else
C.data[k++] = B.data[j++];
}
while (i < A.length)
C.data[k++] = A.data[i++];
while (j < B.length)
C.data[k++] = B.data[j++];
C.length = k;
return true;
}
//逆置n~m位置顺序表算法
int reverse(SqList& L, int n, int m) {
if (n > m || m > L.length - 1)
return false;
int mid = (m + n) / 2;
for (int i = 0; i <= mid - n; i++) {
int temp = L.data[n + i];
L.data[n + i] = L.data[m - i];
L.data[m - i] = temp;
}
return true;
}
//迫使偶数在奇数的前面
int move1(SqList &L){
int i=0,j=L.length-1;
int temp;
while(i<=j){
while(L.data[i]%2==0) i++;
while(L.data[j]%2==1) j--;
if(i<j){
temp=L.data[i];
L.data[i]=L.data[j];
L.data[j]=temp;
}
}
return true;
}
//迫使偶数或奇数在偶数位或奇数位上
int move2(SqList &L){
int i=0,j=1,temp;
while(i<L.length||j<L.length){
while(L.data[i]%2==0) i+=2;
while(L.data[j]%2==1) j+=2;
temp=L.data[i];
L.data[i]=L.data[j];
L.data[j]=temp;
}
return true;
}
Status listInsert(SqList& L, ElemType i, ElemType e) {
int j;
if (L.length >= 20) //list is full元素溢出
{
return FALSE;
}
else if (i<1 || i>L.length + 1) //out of range 超出范围
{
return FALSE;
}
else if (i <= L.length) { //match condition 符合条件
for (j = L.length; j >= i; j--) {
L.data[j] = L.data[j - 1];
}
}
L.data[i - 1] = e;
L.length++;
return TRUE;
}
Status getElem(SqList L, ElemType i) { //search element 查找元素
if (i<1 || i>L.length)
{
return FALSE;
}
return L.data[i - 1];
}
Status locateElem(SqList L, int x) { //定位元素
int i;
for (i = 0; i < L.length; i++) {
if (L.data[i] == x)
return i + 1;
}
return FALSE;
}
//void listReserve(SqList &L){ //顺序表逆置 利用遍历首尾交换
// int temp;
// for(int i=0;i<L.length/2;i++){
// temp=L.data[i];
// L.data[i]=L.data[L.length-1-i];
// L.data[L.length-1-i]=temp;
// }
//}
//void listInsert(SqList &L,int x){ //插入元素后仍然有序
// int i=0,j;
// while(i<L.length&&x>=L.data[i]){ //找到第一个比x大的元素 找到该值的下标
// i++;
// }
// for(j=L.length-1;j>=i;j++){ //
// L.data[j+1]=L.data[i];
// }
// L.data[i]=x;
// L.length++;
//}