代码改变世界

指尖上的代码[C语言版]-<6>

2012-08-12 14:50  java线程例子  阅读(287)  评论(0编辑  收藏  举报

<6> 数据结构---线性表的顺序存储结构

分析:

代码:

#include "stdio.h"
#include "stdlib.h"

#define M 20        /*自定义数组大小*/
#define Type  "%d"
typedef int DataType;  /*为现有类型创建同义词,自己可更改数据类型*/

typedef struct
             {
                DataType array[M];   /*数组*/
                int subscript;      /*数组最后一个元素的下标*/
             } sequencetable;   /*自定义数据类型sequenacetable*/

sequencetable *s;  /*定义sequencetable类型的指针变量s*/

int flag=0;   /*用来标示数组是否初始化了*/

/*函数声明*/
void Initialization();
void Print();
void Insert();
void Delete();

int main(void)
{
   int options;
   printf("数据结构>>线性表的顺序存储结构\n");
   printf("1.初始化顺序表\n");
   printf("2.浏览顺序表\n");
   printf("3.按位置插入元素\n");
   printf("4.按位置删除元素\n");
   printf("5.退出\n");
   while(1)
       {
          printf("请选择您要进行的操作:");
          scanf("%d",&options);
          switch(options)
                {
                   case 1:Initialization();break;
                   case 2:Print();break;
                   case 3:Insert();break;
                   case 4:Delete();break;
                   case 5:free(s);exit(0);break;
                   default:printf("请输入数字1-5进行选择!\n");
                }
       }
   return 0;   
}

void Delete()
{
  int locate,i;
  if(flag==0)
    {
      printf("请先对顺序表初始化!\n");
    }
  else
    {
      if(s->subscript==-1)
        {
          printf("顺序表里暂时没有数据,不能进行删除操作!\n");
        }
      else
        {
          printf("请输入您要删除的元素所在的位置(0<位置<=%d):",s->subscript+1);
          scanf("%d",&locate);
          if(locate>(s->subscript+1))
            {
              printf("您要删除的元素不存在!\n");
              Delete();
            }
          else
            {
              if(locate==s->subscript+1)
                {
                  s->subscript--;
                }
              else
                {
                  for(i=locate;i<=s->subscript;i++)
                     {
                       s->array[i-1]=s->array[i];
                     }
                  s->subscript--;
                }
              printf("元素已成功删除!\n");
            }
        }
    }
}

void Insert()
{
  int locate,i;
  DataType x;
  if(flag==0)
    {
      printf("请先对顺序表进行初始化!\n");
    }
  else
    {
      printf("请输入您想要要插入的位置(1-%d):",M);
      scanf("%d",&locate);
      if(locate<=0||locate>M)
        {
          printf("您输入的位置不在1-%d之间,请重新输入!\n",M);
          Insert();
        }
      else
        {
          printf("请输入您要插入的元素:");
          scanf(Type,&x);
          if(s->subscript<locate-1)
            {
              s->subscript=locate-1;
              s->array[s->subscript]=x;
            }
          else 
            {
              if(s->subscript==M-1)
                {
                  if(locate==M)
                    {
                      s->array[s->subscript]=x;
                    }
                  else
                    {
                      for(i=s->subscript-1;i>=locate-1;i--)
                         {
                           s->array[i+1]=s->array[i];
                         }
                      s->array[locate-1]=x;
                    }
                }
              else
                {
                  s->subscript++;
                  for(i=s->subscript-1;i>=locate-1;i--)
                     {
                       s->array[i+1]=s->array[i];
                     }
                  s->array[locate-1]=x;
                }
            }
          printf("元素已成功插入顺序表!\n");
        }
    }
}

void Print()
{
  int i;
  if(flag==0)
    {
       printf("请先对顺序表初始化!\n");
    }
  else   if(s->subscript==-1)
           { 
             printf("顺序表里暂时没有数据!\n");
           }  
         else
           {
             for(i=0;i<=s->subscript;i++)
               {
                 printf(Type,s->array[i]);
                 printf("  ");
               }  
             printf("\n");
           }
}

void Initialization()
{
   s=(sequencetable *)malloc(sizeof(sequencetable)); /*为顺序表申请内存空间*/
   s->subscript=-1;
   flag=1;
   printf("顺序表初始化已完成!\n");
}


编译结果:


点石成金  写于  2012/08/12/14:54