使用前提:会使用C/C++,了解数据结构基础
描述:创建并使用顺序表
说明:
1:只能按顺序插入,不能随机插入;2:如过你的环境中可以支持#include<conio.h>头文件就更好了,可以解锁s没有也不影响;
例如:先插入第一个与第二个位置之后才能插入第三个位置,总之需要前面的位置都有数据存在
具体代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXSIZE 100
typedef int DataType;
typedef struct{
DataType *data;
// 空间大小
int size;
int length;
}SeqList;
// void wait(){
// printf("\n为什么消灭私有制保护打工者的利益?,请按任意键继续\n");
// getch();
// }
int go_on(){
int flag=1,i;
char choice;
while (1) {
printf("继续请输入1,停止请输入0\n");
scanf("%d",&i);
if (i==1) {
break;
}
else if (i==0) {
flag=0;
break;
}
else {
printf("请按要求输入,谢谢\n");
}
}
return (flag);
}
// 初始化
void Init_SeqList(SeqList *L,int n){
L->data=(DataType *)malloc(n*sizeof(DataType));
if(!L->data){
printf("内存分配失败\n");
exit(-1);
}
L->length=0;
}
// 插入运算
int Insert_SeqList(SeqList *L,int i,DataType x){
DataType *p,*q;
if (L->length==MAXSIZE){
printf("\n表满不能插入\n");
return (-1);
}
if (i<1||i>L->length+1) {
printf("\n插错位置,不能插入\n");
return (0);
}
// q指向插入位置
q=&(L->data[i-1]);
for(p=&(L->data[L->length-1]);p>=q;p--){
*(p+1)=*p; /*元素向后移一位*/
}
*q=x;
L->length++;
return (1);
}
void Insert(SeqList *L){
DataType x;
int i,flag=1,insert_flag;
while (flag) {
printf("\n请输入要插入的位置\n");
scanf("%d",&i);
printf("\n请输入要插入的元素\n");
scanf("%d",&x);
insert_flag=Insert_SeqList(L,i,x);
if (insert_flag==1){
printf("\n插入成功\n");
}
else
printf("\n插入失败\n");
flag=go_on();
}
}
// 删除运算
int Delete_SeqList(SeqList *L,int i){
DataType *p,*q;
// 表空不能删除,删除失败返回-1
if (L->length==0) {
printf("\n表空,不能删除\n");
return (-1);
}
// 删除位置错误不能删除
if(i<1||i>L->length){
printf("\n删除位置错误,不能删除\n");
return (0);
}
q=&(L->data[L->length-1]);/*q指向最后一个元素位置*/
// 元素向前移动
for(p=&(L->data[i]);p<=q;p++){
*(p-1)=*p;
}
// 当前表长度减一
L->length--;
return (1);
}
void Delete(SeqList *L){
int i,flag=1,delete_flag;
while (flag) {
printf("\n请输入要删除元素的位置\n");
scanf("%d",&i);
delete_flag=Delete_SeqList(L,i);
if (delete_flag==1) {
printf("\n删除成功\n");
}
else {
printf("\n删除失败\n");
}
flag=go_on();
}
}
// 按值查找运算,在顺序表中查找元素x,成功则返回x位置的序号,若查找失败返回-1
int Locate_SeqList(SeqList *L,DataType x){
DataType *p;
int i;
i=0;
p=L->data;
while (i<=L->length-1&&*p!=x) {
i++;
p++;
}
if(i>L->length-1){
return (-1);
}
// 查找成功返回x的位置序号(第几个)
else {
return (i+1);
}
}
void Locate(SeqList *L){
DataType x;
int flag=1,locate_flag;
while (flag) {
printf("\n请输入要查找的元素:\n");
scanf("%d",&x);
locate_flag=Locate_SeqList(L,x);
if(locate_flag>0){printf("\n查找成功,%d是第%d个元素\n",x,locate_flag);
}
else printf("\n查找失败,没有元素\n");
flag=go_on();
}
}
// 输出顺序表
void Display_SeqList(SeqList *L){
int i;
printf("\n顺序表全部元素\n");
for(i=0;i<=L->length-1;i++){
printf("%4d",L->data[i]);
printf("\n");
}
}
// 销毁顺序表
// void DestroyList(SeqList *L);
main(){
SeqList L;
int flag=1,j;
Init_SeqList(&L,MAXSIZE);
do {
printf("\n");
printf("-------顺序表动态数组的实现---------\n");
printf("插入元素请摇1\n");
printf("删除元素请摇2\n");
printf("查找元素请摇3\n");
printf("输出元素请摇4\n");
printf("退出请摇0\n");
printf("----------------------\n");
scanf("%d",&j);
switch (j) {
case 1:Insert(&L);break;
case 2:Delete(&L);break;
case 3:Locate(&L);break;
case 4:Display_SeqList(&L);break;
case 0:flag=0;printf("感谢大哥的使用\n");break;
}
}while (flag==1);
}