打卡第1天^O^顺序表及其操作
12
发布于 陕西

#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;

}

评论 (0)