您的位置:首页 > 其它

顺序表的实现

2016-05-12 23:30 344 查看
顺序表:逻辑上连续,物理结构上也连续

实现一个具有“增、删(根据位置删除,根据元素删除)、查、初始化、输入、打印”等简单功能的顺序表:

源码:
头文件部分("sequence.h"):

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int last;
}SeqList;

void creat(SeqList *L);                               //创建顺序表

int InsertSList(SeqList  *L, int i, int x);          //在i位置插入x

int DeleteList(SeqList  *L, int i);                 //删除i位置的元素

int GetData(SeqList *L, int  x);                          //查找值为x的下标

int GetLength(SeqList *L);           //求顺便长度

int InitSList(SeqList *L);       //初始化顺序表,释放整个顺表

void output(SeqList * L);                 //打印整个顺序表

void reverse_list(SeqList *L);        //反转整个顺序表

void sortrank(SeqList *L);                  //对顺序表进行排序

//封装函数部分("sequence.c"):

#include"sequence.h"
void creat(SeqList *L)                          //创建一个顺序表
{
printf("请输入顺序表:\n");
for (int n = 0; n <= L->last; n++)
{
scanf("%d", &(L->data
));
}
printf("输入成功\n");
}

int InsertSList(SeqList  *L, int i, int x)         //将x插入到i位置上,成功返回1
{
if ((i<1) || i>(L->last + 2))
return -1;
if ((L->last) == (MAXSIZE - 1))
return -1;
for (int n = L->last; n >= i - 1; n--)
L->data[n + 1] = L->data
;
L->data[i - 1] = x;
L->last++;
return 1;
}

int DeleteList(SeqList  *L, int i)                     //删除i位置上的元素,成功返回1
{
if ((i > L->last + 1) || (i < 1))
return -1;
if (L->last == -1)
return -1;
for (int n = i - 1; n <L->last; n++)
{
L->data
 = L->data[n + 1];
}
L->last--;
return 1;
}

int GetData(SeqList *L, int  x)                      //查找x元素的所在的位置
{
int i = 0;
if (L->last<0)
return -1;
while (i <= L->last)
{
if (L->data[i] == x)
return i + 1;
i++;
}
return -1;
}

int GetLength(SeqList *L)                           //求取表的长度
{
return (L->last + 1);
}

int InitSList(SeqList *L)                          //初始化顺序表,将当前顺序表释放
{
L->last = -1;
return 1;
}

void output(SeqList * L)                   //打印顺序表
{
if (L->last==-1)
{
printf("请先创建顺序表\n");
}
else
{
for (int n = 0; n <= L->last; n++)
printf("%d  ", L->data
);
printf("\n");
}
}

void reverse_list(SeqList *L)
{
if (L->last == -1)
printf("请先创建顺序表\n");
else
{
ElemType *left = L->data;
ElemType *right = left + L->last;
while (left<right)
{
ElemType tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
printf("逆序成功\n");
}
}

void sortrank(SeqList *L)                               //对顺序表进行排序
{
ElemType tmp;
int i = 0;
int j = 0;
for (i = 0; i <= L->last; i++)
{
for (j = 0; j <(L->last - i); j++)
{
if (L->data[j]>L->data[j + 1])
{
tmp = L->data[j];
L->data[j] = L->data[j + 1];
L->data[j + 1] = tmp;
}
}
}
printf("排序成功\n");
}

主函数部分:

#include"sequence.h"

int main()
{
int m = 0;
int n = 0;
int i = 0;
int ret=0;
ElemType x;
SeqList L;
L.last = -1;
printf("***********************************************\n");
printf("***********************************************\n");
printf("********0.exit             1.Creat*************\n");
printf("********2.InsertSList      3.ListDelete********\n");
printf("********4.FindData         5.GetLength*********\n");
printf("********6.InitSList        7.output************\n");
printf("********8.ReverseList      9.Sortrank**********\n\n\n");
while (1)
{
printf("请选择功能:  ");
scanf("%d", &n);
switch (n)
{ 
 case 0:
 exit(1);
 break;
 case 1:
 while (1)
 {
 printf("请输入顺序表长度:");
 scanf("%d", &L.last);
 if (L.last < 1)
 printf("输入无效,请重新输入\n");
 else
 break;
 }
 L.last = L.last - 1;
 creat(&L);
 break;
 case 2:
 printf("请输入要插入的位置:  和要插入的元素:\n");
 scanf("%d%d", &i, &x);
 ret = InsertSList(&L, i, x);
 if (ret == 1)
 printf("插入成功\n");
 else
 printf("插入失败\n");
 break;
 case 3:
 printf("****1、位置删除   2、元素删除****\n");
 printf("请选择删除方式:");
 while (1)
 {
 scanf("%d", &m);
 if (m==1||m==2)
 break;
 else
 printf("选择无效,请重新选择\n");
 }
 switch (m)                                     //开始执行删除的方式
 {
 case 1:
 {
   printf("请输入要删除的位置:");
   scanf("%d", &i);
   ret = DeleteList(&L,i);
   break;
 }
 case 2:
 {
   int i = 0;
   printf("输入要删除的元素:");
   scanf("%d", &x);
   while (1)
   {
   i = GetData(&L, x);
   if (i ==-1)
   break;
   ret =DeleteList(&L, i);
   }
   break;
  }                                                        //删除结束
 }
 if (ret == 1)
 printf("删除成功\n");
 else
 printf("删除失败\n");
 break;
 case 4:
 printf("请输入要查找的元素:");
 scanf("%d",&x);
 ret=GetData(&L,x);
 if (ret==-1)
 printf("查询无果\n");
 else	 
         printf("查找成功:%d\n",ret);
 break;
 case 5:
 ret=GetLength(&L);
 printf("顺序表长度:%d\n", ret);
 break;
 case 6:
 InitSList(&L);
 printf("初始化成功\n");
 break;
 case 7:
 printf("打印顺序表:");
 output(&L);
 break;
 case 8:
 reverse_list(&L);
 break;
 case 9:
 sortrank(&L);
 break;
 default:
 printf("选择无效,请重新选择\n");
 break;
}
 ret = 0;
}
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: