顺序表代码(指针实现)

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 10
#define OK 1
#define ERROR 0
#define TRUE 1
#define FLASE 0
#define OVERFLOW -2

typedef int ElemType;
typedef int Status;
typedef struct{
  ElemType * elem;
  int len; 
} Sqlist;

/**************************
    创建
输入:顺序表指针
输出:状态码
功能:初始化顺序表
**************************/
Status initList(Sqlist *L){
  L->elem = (ElemType*)malloc(SIZE * sizeof(ElemType*));
  if(!L->elem){
   printf("overflow!\n");
   return OVERFLOW;
  }
  L->len = 0;
  return OK;
}

/**************************
    插入
输入:顺序表指针,插入位,插入值
输出:状态码
功能:插入数据
**************************/
Status insertList(Sqlist *L, int index,ElemType e){

  index--;    //输入index起始为1,而程序起始为0,下面亦同

  //overflow
  if( index>L->len || index<0 ||L->len>=SIZE) {
   printf("overflow!\n");
   return OVERFLOW;
  }

  //insert last one
  if( index == L->len){
    *(L->elem+L->len)=e;
    L->len++;
    return OK;
  }

  //ElemType * q = L->elem + index;
  ElemType * q = &(L->elem[index]);
  ElemType * p = &(L->elem[L->len]);
  
  for(;p>q;p--)
     *p=*(p-1);

  *p  = e;
  L->len++;
 
  return OK;
}

/**************************
    删除
输入:顺序表指针,删除位,存储指针
输出:状态码
功能:删除数据并返回其值
**************************/
Status deleteList(Sqlist *L,int index,ElemType *e){
  index--;

  if(index>L->len||index<0){
    printf("overflow!!\n");
    return OVERFLOW;
  }

  if(index == L->len){
    L->len--;
    return OK;
  }

  ElemType * q = L->elem+L->len;
  ElemType * p = &(L->elem[index]);

  while(p<q){
    *p = *(p+1);
    p++;
  }

  L->len--;

  return OK;
}

/**************************
      追加
输入:顺序表指针,追加值
输出:状态码
功能:追加数据
**************************/
Status appendList(Sqlist * L,ElemType e){
  
  if(L->len >= SIZE){
    printf("overflow!\n");
    return OVERFLOW;
  }

  *(L->elem + L->len++) = e;

  return OK;
}

/**************************
      打印
输入:顺序表指针
输出:状态码
功能:将顺序表值一一打印出来
**************************/
Status printList(Sqlist L){
  if(L.len == 0)printf("list is empty!\n");
  ElemType * p = L.elem;
  for(;p<(L.elem+L.len);p++)
     printf("[%d] ",*p);

  printf("\n");
  return OK;
}


int main(){
 int index,e;
 Sqlist L;
 initList(&L);
 printList(L);
 
 //append
 printf("[append] enter value:");
 scanf("%d",&e);
 appendList(&L,e);
 printList(L);
 
 //append
 printf("[append] enter value:");
 scanf("%d",&e);
 appendList(&L,e);
 printList(L);

 //insert
 printf("[insert] enter index:");
 scanf("%d",&index);
 printf("[insert] enter value:");
 scanf("%d",&e);
 insertList(&L,index,e);
 printList(L);

 //delete
 printf("[delete] enter index:");
 scanf("%d",&index);
 deleteList(&L,index,&e);
 printList(L);
 return 0;
}

 
 
下面是另一种写法(但推荐使用上面一种)

 

#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2

typedef int ElemType;
typedef int Status;
typedef struct{
  ElemType * elem;
  int last;
} Sqlist;

Sqlist initList(){
  Sqlist L;
  L.elem = (ElemType*)malloc(MAX * sizeof(ElemType));
  if(!L.elem){
    printf("overflow!!\n");
    exit(OVERFLOW);
  }
  L.last = 0;
  return L;
}

Sqlist insertList(Sqlist L,int index,ElemType e){
  index--;
  if( L.last >= MAX || index<0 || index>L.last){
    printf("overflow!\n");
    exit(OVERFLOW);
  }

  if( L.last == index ){
     *(L.elem + L.last++) = e;
     return L;
  }

  ElemType * p = L.elem + L.last;
  ElemType * q = &L.elem[index];
  while(p>q){
    *p = *(p-1);
    p--;
  }

  *p = e;

  L.last++;
  return L;
}

Sqlist deleteList(Sqlist L,int index,ElemType *e){
  index--;
  if( index < 0 || index >=L.last){
    printf("overflow!!\n");
    exit(OVERFLOW);
  }

  if(index == L.last-1){
    L.last--;
    return L;
  }

  ElemType * p = &(L.elem[index]);
  ElemType * q = L.elem + L.last - 1;
 
  while(p<q){
    *p = *(p+1);
    p++;
  }
  L.last--;
  return L;
}


Status printList(Sqlist L){
  if(L.last == 0){
    printf("empty\n");
    return OK;
  }
  ElemType * p = L.elem;
  ElemType * q = L.elem+L.last;
  while(p<q){
   printf("[%d] ",*p);
   p++;
  }

  printf("\n");
  return OK;
}

Sqlist appendList(Sqlist L,ElemType e){
  if(L.last >= MAX){
   printf("overflow!\n");
   exit(OVERFLOW);
  }

  *(L.elem + L.last++) = e;
  return L;
}

int main(){
  int index,e;
  Sqlist L = initList();
  printList(L);

  //append
  printf("[append] enter value:");
  scanf("%d",&e);
  L = appendList(L,e);
  printList(L);

  //append
  printf("[append] enter value:");
  scanf("%d",&e);
  L = appendList(L,e);
  printList(L);

  //insert
  printf("[insert] enter index:");
  scanf("%d",&index);
  printf("[insert] enter value:");
  scanf("%d",&e);
  L = insertList(L,index,e);
  printList(L);

  //delete
  printf("[delete] enter index:");
  scanf("%d",&index);
  L = deleteList(L,index,&e);
  printList(L);

  return 0;
}

 

 

posted @ 2017-07-05 00:35  Khazix  阅读(2364)  评论(0编辑  收藏  举报