#include<stdio.h>
#include<stdbool.h>
#define MaxSize 50
//顺序表SqList
typedef struct {
int data[MaxSize];
int length;
} SqList;
//初始化空表
void InitList(SqList *L) {
L->length = 0;//这里L是结构体指针,用L->访问成员
}
bool ListInsert(SqList *L,int i,int e) { //按位插入,i是位置,e是插入值
if(L->length==MaxSize) {//表已满
return false;
}
if(i>L->length+1||i<=0) {//不能留空位
return false;
}
if(i==L->length + 1) {//正好插在最后一个元素后面
L->data[i-1]=e;
L->length++;
}
else {
int j=0;
for(j=L->length; j>=i; j--) {//注意j是从后往前走
L->data[j]=L->data[j-1];
}
L->data[i-1]=e;//插入位置只和i有关
L->length++;
}
return true;
}
bool ListDelete(SqList *L,int i,int *e) { //按位删除
if(i<=0||i>L->length) {
return false;
}
*e=L->data[i-1];//e是指针,*e是指针所指的内容,这里要修改指针指向的具体值
int j=0;
for(j=i; j<L->length; j++) {//当j==L->length时直接删掉最后元素,只需L->length--
L->data[j-1]=L->data[j];
}
L->length--;
return true;
}
void PrintList(const SqList *L) { //保护指针L指向的内容,使其为只读,L本身可以改、指向别的
int i=0;
for(i=0; i<L->length; i++) {
printf("%d ", L->data[i]);
}
printf("\n");
}
int LocateElem(const SqList *L,int e) {//打印出来的值无法用变量接收,所以才有数值返回类型
int i=0;
for(i=0; i<L->length; i++) {
if(L->data[i]==e) {
return i+1;
}
}
return 0;
}
void ReverseList(SqList *L) {//表的逆序
int left=0;
int right=L->length-1;
int temp=0;
while(left<right) {
temp=L->data[left];
L->data[left]=L->data[right];
L->data[right]=temp;
left++;
right--;
}
}
void DelAllX(SqList *L,int x) { //删除表中所有=x的元素,快慢指针法,快指针便历,慢指针记录保留元素
int fast=0;
int slow=0;
while(fast<L->length) {
if(L->data[fast]!=x) {
L->data[slow++]=L->data[fast++];
}
else {
fast++;
}
}
L->length=slow;
}
void EvenFront(SqList *L) { //所有偶数挪到前面,奇数挪到后面,even有偶数的意思
int left=0;
int right=L->length-1;
int temp=0;
while(left<right) {
while(L->data[left]%2==0&&left<right) { //是偶数,并且left<right,left就右移,否则停住
left++;
}
while(L->data[right]%2==1&&left<right) {//是奇数,并且left<right,right就左移,否则停住
right--;
}
if(left<right) {
temp=L->data[left];
L->data[left]=L->data[right];
L->data[right]=temp;
left++;
right--;
}
}
}
int main(void) {
SqList L;
printf("----------测试InitList-----------\n");
InitList(&L);//&是取地址,传给指针形参
printf("打印空表长度%d\n",L.length);//这里L是结构体实体,用L.访问成员
printf("----------测试ListInsert-----------\n");
for(int i=0; i<MaxSize; i++) {
ListInsert(&L,i+1,i);
}
printf("----------测试PrintList-----------\n");
PrintList(&L);
printf("----------测试ReverseList-----------\n");
ReverseList(&L);
PrintList(&L);
printf("----------测试DeleteList-----------\n");
int e;
for(int i=0; i<10; i++) {
ListDelete(&L,i+1,&e);
}
PrintList(&L);
printf("----------测试LocateElem-----------\n");
int p=LocateElem(&L,15);
if(p!=0) {
printf("所查元素在第%d位\n",p);
} else {
printf("未找到所查元素\n");
}
printf("----------测试DelAllX-----------\n");
DelAllX(&L,6);
PrintList(&L);
printf("----------测试EvenFront-----------\n");
EvenFront(&L);
PrintList(&L);
return 0;
}