关于顺序表的简单操作合集

时间:2021-10-08 23:47:54

顺序表是最简单的一种,操作也是比较简单的增删找置


删除和插入需要进行前移或者后移,仅此


#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#define MAX 100

struct seList{
int data[MAX];
int n;
};

typedef struct seList * list;

list makelist(void);
void print(void);
int insertPost_seq(list palist, int p, int x);
void display(list palist, int n);
void reverseList(list palist);
void deleteall(list palist, int x);
void deleteV_seq(list palist, int x);

int main(void)
{
list arr;
char ch;
int i, p, x, n = 0, num;

arr = makelist();

printf("输入原始数据个数:");
scanf("%d", &num);
printf("\n");
printf("输入数据:");
for(i = 0; i < num; i++)
{
scanf("%d", &arr->data[i]);
arr->n += 1;
}
printf("数据读取完成....\n\n");

printf("a.插入 b.删除某元素 c.输出顺序表\n");
printf("d.置逆 e.删除所有值为x的元素 q.退出\n");

while(scanf("%c", &ch) && ch != 'q')
{

switch(ch)
{
case 'a': printf("输入要插入的位置及元素:");scanf("%d %d", &p, &x);if (insertPost_seq(arr, p, x))display(arr, arr->n); print();break;
case 'c': printf("展示如下:\n");display(arr, arr->n);print();break;
case 'b': printf("删除的单个元素:");scanf("%d", &p);deleteV_seq(arr, p);display(arr, arr->n);print();break;
case 'd': reverseList(arr);display(arr, arr->n);print();break;
case 'e': printf("删除的值:");scanf("%d",&x);deleteall(arr, x);display(arr, arr->n);print();break;
}
}

}

void deleteall(list palist, int x)
{
list temp = palist;
int i, k, cup[MAX], j, count = 0, flag = 1;

for(i = 0, j = 0; i < temp->n; i++)
{
if (temp->data[i] == x)
{
cup[j] = i;
count++;
j++;
}else
flag = 0;

}

if (flag)
{
for(i = count-1; i >= 0; i--)
{
for(k = cup[i]; k < temp->n; k++)
{
palist->data[k] = palist->data[k+1];
}
temp->n--;
}
printf("所有值为%d的元素删除成功\n", x);
}else
printf("无%d元素\n", x);
}

void reverseList(list palist)
{
list temp = palist;
int i, cup;

for(i = palist->n-1; i >= ((palist->n + 1)/ 2); i--)
{
cup = palist->data[i];
palist->data[i]= palist->data[palist->n-i-1];
palist->data[palist->n-i-1] = cup;
}
printf("置逆成功\n");
}

void deleteV_seq(list palist, int x)
{
list temp = palist;
int i, cup, j, flag = 1;

for(i = 0; i < temp->n; i++)
{
if (temp->data[i] == x)
{
cup = i;
break;
}else
{
flag = 0;
}
}

if (flag)
{
for(j = cup; j < palist->n; j++)
{
palist->data[j] = palist->data[j+1];
}
palist->n--;
printf("删除成功\n");
}else
printf("无%d元素\n", x);

}

list makelist(void)
{
list plist;
plist = (list)malloc(sizeof(struct seList));


if (plist)
{
plist->n = 0;
printf("顺序表创建成功\n");
return plist;
}
else
{
printf("no memory");
}

return NULL;
}

int insertPost_seq(list palist, int p, int x)
{
int i;
if (p < 0 || p > palist->n)
{
printf("位置错误\n\n");
return 0;
}

for(i = palist->n; i >= p; i--)
{
palist->data[i+1] = palist->data[i];
}


palist->data[p+1] = x;
printf("插入成功\n");
palist->n++;

return 1;
}

void display(list palist, int n)
{
list temp = palist;
int j;
for(j = 0; j < n; j++)
{
printf("%d ", temp->data[j]);
}
printf("\n");
putchar('\n');
}


void print(void)
{
printf("a.插入 b.删除某元素 c.输出顺序表\n");
printf("d.置逆 e.删除所有值为x的元素 q.退出\n");
}