1. #include <stdio.h>  
  2. #include <malloc.h>  
  3.  
  4. #define LIST_SIZE 100  
  5. #define  LISTINCREMENT 10  
  6.  
  7. typedef char ElemType;  
  8.  
  9.  
  10. typedef struct 
  11. {  
  12.  ElemType * elem;  
  13.  int length;  
  14.  int listsize;  
  15. }SqList;  
  16.  
  17. SqList L;  
  18.  
  19.  
  20. SqList *InitiaList()  
  21. {  
  22.  L.elem = (ElemType *)malloc(LIST_SIZE * sizeof(ElemType));  
  23.  if (!L.elem)  
  24.  {   
  25.   printf("益处,扩展空间失败!");  
  26.   return 0;  
  27.  }  
  28.  L.length = 0;  
  29.  L.listsize = LIST_SIZE;  
  30.  return &L;  
  31. }  
  32.  
  33.  
  34. void DestoryList(SqList *L)  
  35. {  
  36.  //此处如果写成free(L)会报错  
  37.  free(L->elem);  
  38. }  
  39.  
  40.  
  41. int ListInsert(SqList * L,int i,ElemType e)  
  42. {  
  43.  int j;  
  44.  ElemType *newbase;  
  45.  //位置不合法  
  46.  if (i < 1 || i > L->length +1)  
  47.  {  
  48.   printf("位置不合法!");  
  49.   return 0;  
  50.  }  
  51.  //表满,申请额外空间  
  52.  if (L ->length == L->listsize)  
  53.  {  
  54.   newbase = (ElemType *)realloc(L->elem,  
  55.    (L->listsize+LISTINCREMENT)  
  56.    *sizeof(ElemType));  
  57.   if (!newbase)  
  58.   {  
  59.    printf("溢出,扩展空间失败!");  
  60.    return 0;  
  61.   }  
  62.   L->elem = newbase;  
  63.   L->listsize += LISTINCREMENT;  
  64.  }  
  65.  //将位序参数转化为数组下标  
  66.  i--;  
  67.  //后移元素  
  68.  for (j = L->length-1;j > i;j --)  
  69.  {  
  70.   L->elem[j+1] = L->elem[j];  
  71.  }  
  72.  //插入元素  
  73.  L->elem[i] = e;  
  74.  L->length++;  
  75.  return 1;  
  76. }  
  77.  
  78.  
  79. int ListDelete(SqList * L,int i)  
  80. {  
  81.  int j;  
  82.  if (L->length == 0)  
  83.  {  
  84.   printf("这是个空表,无法删除!");  
  85.   return 0;  
  86.  }  
  87.  else 
  88.  {  
  89.   if (i <1 || i > L->length)  
  90.   {  
  91.    printf("输入位置不合法!");  
  92.    return 0;  
  93.   }  
  94.  }  
  95.  i--;  
  96.  for (j = i;j < L->length -1;j ++)  
  97.  {  
  98.   L->elem[j] = L->elem[j+1];  
  99.  }  
  100.  L->length--;  
  101.  return 1;  
  102. }  
  103.  
  104.  
  105. void ListTraverse(SqList * L)  
  106. {  
  107.  int i;  
  108.  if (L->length == 0)  
  109.  {  
  110.   printf("空表!\n");  
  111.  }  
  112.  else 
  113.  {  
  114.   for (i = 0 ; i < L->length ; i++)  
  115.   {  
  116.    printf("%c",L->elem[i]);  
  117.    printf("\n");  
  118.   }  
  119.  }  
  120. }  
  121.  
  122.  
  123. void LocatElem(SqList * L,ElemType e,int f)  
  124. {  
  125.  int i;  
  126.  switch(f)  
  127.  {  
  128.  case 0:  
  129.   for (i = 0; i < L->length; i ++)  
  130.   {  
  131.    if (L->elem[i] == e)  
  132.    {  
  133.     ++i;  
  134.     break;  
  135.    }  
  136.   }  
  137.   break;  
  138.  case 1:  
  139.   for (i = 0; i < L->length; i ++)  
  140.   {  
  141.    if (L->elem[i] < e)  
  142.    {  
  143.     ++i;  
  144.     break;  
  145.    }  
  146.   }  
  147.   break;  
  148.  case 2:  
  149.   for (i = 0; i < L->length; i ++)  
  150.   {  
  151.    if (L->elem[i] > e)  
  152.    {  
  153.     ++i;  
  154.     break;  
  155.    }  
  156.   }  
  157.   break;  
  158.  default:  
  159.   printf("参数错误!\n");  
  160.  }  
  161.  if (i <= L->length)  
  162.  {  
  163.   printf("所比较元素的关系位于第%d\n",i);  
  164.  }  
  165.  else 
  166.  {  
  167.   printf("不能比较!\n");  
  168.  }  
  169. }  
  170.  
  171.  
  172. void chose(int a)  
  173. {  
  174.  int n,i,m;  
  175.  ElemType e;  
  176.  switch(a)  
  177.  {  
  178.  case 1:  
  179.   InitiaList();  
  180.   ListTraverse(&L);  
  181.   break;  
  182.  case 2:  
  183.   printf("请输入插入元素个数:");  
  184.   scanf(" %d",&n);  
  185.   for ( i = 0 ; i < n ; i ++)  
  186.   {  
  187.    printf("请输入插入的元素:");  
  188.    scanf(" %c",&e);  
  189.    printf("请输入插入的元素的位置:");  
  190.    scanf("%d",&m);  
  191.    ListInsert(&L,m,e);  
  192.   }  
  193.   ListTraverse(&L);  
  194.   break;  
  195.  case 3:  
  196.   printf("请输入删除元素个数:");  
  197.   scanf(" %d",&n);  
  198.   for ( i = 0 ; i < n ; i ++)  
  199.   {  
  200.    printf("请输入要删除的元素的位序:");  
  201.    scanf(" %d",&m);  
  202.    ListDelete(&L,m);  
  203.   }  
  204.   ListTraverse(&L);  
  205.   break;    
  206.  case 4:  
  207.   printf("请输入需要比较的元素:");  
  208.   scanf(" %c",&e);  
  209.   printf("请输入需要比较元素的关系(0为等于输入元素,1为小于输入元素,2为大于输入元素):");  
  210.   scanf("%d",&m);  
  211.   LocatElem(&L,e,m);  
  212.   ListTraverse(&L);  
  213.   break;   
  214.  case 5:  
  215.   DestoryList(&L);  
  216.   printf("释放顺序表成功!\n");   
  217.   break;  
  218.  default:  
  219.   printf("参数错误!\n");    
  220.  }  
  221. }  
  222.  
  223.  
  224. void main()  
  225. {  
  226.  int a;  
  227.  printf("1.建立新表\n");  
  228.  printf("2.插入元素\n");  
  229.  printf("3.删除元素\n");  
  230.  printf("4.找出表中与输入元素e满足大于/小于/等于关系的第一个元素的位序\n");  
  231.  printf("5.释放顺序表\n");  
  232.  printf("0.结束程序\n");  
  233.  for ( a = 1 ; a != 0 ; )  
  234.  {  
  235.   printf("请输入需要操作对应的数字:");  
  236.   scanf("%d",&a);  
  237.   chose(a);  
  238.  }  
  239. }  
  240.