#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAX 100
/**
*@Name:线性表--顺序表
*@Description:顺序表的创建、初始化、遍历、元素的插入、删除和修改和移动。
*@Author:Freedoman
*@Date: 2014-8-5
*/
struct SeqList //顺序表类型
{
int index; //当前元素下标
int element[MAX]; //顺序表元素
};
typedef struct SeqList * PSeqList;
/*函数声明*/
PSeqList createNullSeqList();
int isNullSeqList(PSeqList curSeqList);
void initSeqList(PSeqList curSeqList);
int findIndexByElement(PSeqList curSeqList);
int findElementByIndex(PSeqList curSeqList);
int insertEleBeforeIndex(PSeqList curSeqList);
int insertEleAfterIndex(PSeqList curSeqList);
int deleteElementByIndex(PSeqList curSeqList);
int deleteElement(PSeqList curSeqList);
void printSeqList(PSeqList curSeqList);
/*-----------创建固定容量空顺序表------------*/
PSeqList createNullSeqList(){
printf("创建固定容量空顺序表\n");
PSeqList curSeqList=(PSeqList)malloc(sizeof(SeqList));
if(curSeqList != NULL){
curSeqList->index = -1;
printf("创建成功!\n");
}else{
free(curSeqList);
printf("创建失败!\n");
}
return curSeqList;
}
/*---------------判断顺序表是否为空------------*/
int isNullSeqList(PSeqList curSeqList){
if(curSeqList->index == -1){
printf("当前顺序表为空!\n");
return 1;
}
else{
printf("当前顺序表不为空!\n");
return 0;
}
}
/*-------------初始化顺序表-----------------*/
void initSeqList(PSeqList curSeqList){
printf("初始化顺序表\n");
int i = 0,x;
if(isNullSeqList(curSeqList)){
while(i < MAX){
printf("请输入元素>>>");
scanf("%d",&x);
if(x != -1){
curSeqList->element[i] = x;
curSeqList->index = i;
i++;
}else{
break;
}
}
printf("顺序表初始化成功\n");
printSeqList(curSeqList);
}
else{
printf("不能进行初始化\n");
}
}
/*---------------求元素的下标----------------*/
int findIndexByElement(PSeqList curSeqList) {
printf("求元素的下标\n");
int x;
printf("请输入元素>>>");
scanf("%d",&x);
for(int i=0; i <= curSeqList->index; i++){
if(x == curSeqList->element[i]){
printf("元素%d的下标为>>>>%d\n",x,i);
return i;
}
}
printf("没有找到指定元素\n");
return -1;
}
/*---------------求指定下标的元素--------------*/
int findElementByIndex(PSeqList curSeqList){
int index;
printf("请指定下标>>>");
scanf("%d",&index);
for(int i=0; i <= curSeqList->index; i++)
if(i == index){
printf("下标%d的元素为>>>>%d\n",index,curSeqList->element[i]);
return i;
}
printf("下标越界!\n",index);
return -1;
}
/*-----------在指定下标之前插入元素---------*/
int insertEleBeforeIndex(PSeqList curSeqList){
printf("在指定下标之前插入元素\n");
int i,index,x;
printf("请指定下标>>>");
scanf("%d",&index);
printf("请输入元素>>>");
scanf("%d",&x);
if(index >= 0 && index <= curSeqList->index){
// 从后往前依次移动元素element[n+1] = element[n];
for(i=curSeqList->index +1; i > index; i--){
curSeqList->element[i]=curSeqList->element[i-1];
}
curSeqList->element[index]=x;
curSeqList->index += 1;
printf("插入成功!\n");
printSeqList(curSeqList);
return 1;
}
printf("下标越界!\n");
return 0;
}
/*---------在指定下标之后插入元素---------*/
int insertEleAfterIndex(PSeqList curSeqList){
printf("在指定下标之后插入元素\n");
int i,index,x;
printf("请指定下标>>>");
scanf("%d",&index);
printf("请输入元素>>>");
scanf("%d",&x);
if(index >= 0 && index <= curSeqList->index)
{
// 从后往前移动ele[n+1]=ele[n]直到index处
for( i = curSeqList->index+1; i > index+1; i--){
curSeqList->element[i]=curSeqList->element[i-1];
}
curSeqList->element[index+1]=x;
curSeqList->index+=1;
printf("插入成功!\n");
printSeqList(curSeqList);
return 1;
}
printf("下标越界!\n");
return 0;
}
/*------------删除指定下标元素-------------*/
int deleteElementByIndex(PSeqList curSeqList){
printf("删除指定下标元素\n");
int i,index;
printf("请指定下标>>>");
scanf("%d",&index);
if(index >= 0 && index <= curSeqList->index ){
// 元素从删除的下标处起依次向前移动
for(i = index; i < curSeqList->index; i++){
curSeqList->element[i] = curSeqList->element[i+1];
}
curSeqList->index -= 1;
printf("删除成功!\n");
printSeqList(curSeqList);
return 1;
}
printf("下标越界!\n");
return 0;
}
/*--------------删除指定元素---------------------*/
int deleteElement(PSeqList curSeqList){
printf("删除指定元素\n");
int i,j,x;
printf("请输入元素>>>");
scanf("%d",&x);
// 先从头开始搜索元素,定位下标
for(i=0; i<curSeqList->index ; i++){
if(curSeqList->element[i] == x)
{
// 从下标处开始依次向前移动
for(j=i; j<curSeqList->index; j++)
curSeqList->element[j]=curSeqList->element[j+1];
curSeqList->index -= 1;
printf("删除成功!\n");
printSeqList(curSeqList);
return 1;
}
}
printf("未找到!\n");
return 0;
}
/*------------打印当前顺序表-------------------*/
void printSeqList(PSeqList curSeqList){
if(curSeqList != NULL){
printf("打印[");
for(int i=0; i<= curSeqList->index; i++){
printf(" %d ",curSeqList->element[i]);
}
printf("]\n");
}else{
printf("ERROR");
}
}
/*----------------------主控-----------------------*/
int main()
{
int input;
PSeqList curSeqList = NULL;
printf("\n\n--------顺序表的基本操作---------\n\n");
while(1){
printf("\n 1_创建固定容量空顺序表\n 2_判断当前顺序表是否为空\n 3_初始化顺序表\n");
printf(" 4_求元素的下标\n 5_求指定下标的元素\n");
printf(" 6_在指定下标之前插入元素\n 7_在指定下标之后插入元素\n");
printf(" 8_删除指定下标元素\n 9_删除指定元素\n 10_打印当前顺序表\n\n");
printf("\n请选择>>>");
scanf("%d",&input);
switch(input){
case 1 : curSeqList = createNullSeqList();break;
case 2 : isNullSeqList(curSeqList);break;
case 3 : initSeqList(curSeqList);break;
case 4 : findIndexByElement(curSeqList);break;
case 5 : findElementByIndex(curSeqList);break;
case 6 : insertEleBeforeIndex(curSeqList);break;
case 7 : insertEleAfterIndex(curSeqList);break;
case 8 : deleteElementByIndex(curSeqList);break;
case 9 : deleteElement(curSeqList);break;
case 10: printSeqList(curSeqList);break;
default: printf("输入错误,请重新输入"); break;
}
}
return 0;
}
性线表----顺序表的基本操作
最新推荐文章于 2024-06-19 18:48:41 发布