顺序表代码(指针实现)

#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;
}
时间: 2024-10-10 14:29:11

顺序表代码(指针实现)的相关文章

顺序表代码

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #define OK 1 #define ERROR 0 #define MAX 1024 //顺序表最大长度 #define delay 2 //延迟两秒 typedef int ElemType; typedef int STATUS; typedef struct{ ElemType data[MAX]; //数据 int last; //长度 }

顺序表的C语言实现

一直在复习数学,想着要在六月底之前把数学三门四本书都过一遍,最近看到了线性代数了,好多学了都忘记了,慢慢来吧! 前段时间看的线性表了,才看了一点点,关于顺序表大致实现了下,后面抽看看看数据结构了,数学得全力复习了.准备暑假开始系统复习专业课,加油吧! 顺序表代码如下,简单实现了下,正好抓住这个机会复习了结构体,指针等知识.main()函数里写的比较乱,主要在于其他子函数里的实现 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #defi

数据结构复习---顺序表和单链表

1.前言: 最近比较浮躁,想学习一门新的技术却总是浅尝辄止,遇到不懂的地方就想跳过去,时间长了,心态就有点崩了.静下心来,去喝了几碗心灵鸡汤.鸡汤博主感动到了我:"无专注,无风景.不要太贪心,一次只做一件事,而且只做最重要的事.".于是乎,我把家里翻了个底朝天,找到了我垫在床底下的<数据结构>这本书,觉得自己是时候静下心来好好复习一下基础了.今天刚看到顺序表和链表,把我的学习心得记录在这里.也希望自己能坚持,老老实实的把这本书复习完. 2.数据结构的重要性: 讲一门知识之前

用C++实现顺序表

typedef int DataType; #define DEFAULT_CAPACITY 7 #define DEFAULT_INC 9 #include<iostream> #include<assert.h> using namespace std; class Seqlist { friend ostream& operator<<(ostream &os,const Seqlist &s); public: //构造函数 Seqlis

【算法和数据结构】_17_小算法_线性结构:顺序表

/* 本程序用来测试数据结构中的线性结构:顺序表 */ #include <stdio.h> #include <stdlib.h> #define LINEAR_MAX_SIZE 64 struct LinearList { int* List; //顺序表指针 unsigned short int ListLen; //顺序表最大的元素个数 unsigned short int CurrentLen; //顺序表当前元素的个数 }; typedef struct LinearL

十二、队列的实现方法三(顺序表的优化)

由于通过顺序表代码的复用实现队列的过程中,进队列要从队列的最后一个元素进入,所以造成时间复杂度加大,现通过引进front.rear优化队列实现方法 front:代表头元素的下标 rear:代表队尾下一个元素的下标 一.SeqQueue.h #ifndef _SEQQUEUE_H_ #define _SEQQUEUE_H_ typedef void SeqQueue; SeqQueue* SeqQueue_Create(int capacity);  //创建队列 void SeqQueue_De

十、队列的实现方法一(顺序表的复用)

方法一.通过对顺序表代码的复用实现队列 一.SeqList.h #ifndef _SEQLIST_H_ #define _SEQLIST_H_ typedef void SeqList; typedef void SeqListNode; SeqList* SeqList_Create(int capacity); void SeqList_Destroy(SeqList* list); void SeqList_Clear(SeqList* list); int SeqList_Length(

数据结构之线性表(顺序表,单链表)——图书管理系统

顺序表: 代码如下: 1 #include<iostream> 2 #include<fstream> 3 #include<string> 4 #include<iomanip> 5 using namespace std; 6 #define OK 1 7 #define ERROR 0 8 #define OVERFLOW -2 9 typedef int Status; 10 typedef int ElemType; 11 12 #define M

数据结构顺序表中Sqlist *L,&amp;L,Sqlist *&amp;L

//定义顺序表L的结构体 2 typedef struct 3 { 4 Elemtype data[MaxSize]: 5 int length; 6 }SqList; 7 8 //建立顺序表 9 void CreateList(SqList * &L,ElemType a[ ],int n) 10 { 11 int i; 12 L = (SqList * )malloc(sizeof(SqList)); 13 for(i = 0 ; i < n ; i++) 14 L->data[i