数据结构之 c语言实现顺序表

定长顺序表

#include<stdio.h>
#include<stdlib.h>

#define LISTSIZE  10
#define TRUE 1
#define FALSE 0

typedef int ElemType;
typedef int (*Compare)(ElemType, ElemType);
typedef struct SqList
{
 ElemType  data[LISTSIZE];  //  存储数据元素的空间
 int  length;          //   存储当前已有的数据个数
}SqList, * SqListPtr;

static int IsFull_Sq(SqListPtr sqlist) //判满
{
 if(sqlist->length == LISTSIZE)
 {
  return TRUE;
 }
 return FALSE;
}

void InitList_Sq (SqListPtr  sqlist)//初始化
{
 malloc(sizeof(SqListPtr *));
 if(sqlist==NULL) exit(0);
 sqlist->length =0; //将线性表的当前有效长度设为0
}

int InsertList_Sq_Pos(SqListPtr sqlist,ElemType val,int pos)//按位置插入
{
 int i =sqlist->length;
 if(sqlist == NULL) exit(0);
 if(IsFull_Sq(sqlist)) return FALSE;
 if(pos<0||pos>sqlist->length ) return FALSE;
 while(i>pos)
 {
  sqlist->data[i] =sqlist->data[i-1];
  i--;
 }
 sqlist->data [i]= val;
 sqlist->length++;
 return TRUE;
}
int InsertList_Sq_Head(SqListPtr sqlist, ElemType val)// 头插
{
 return InsertList_Sq_Pos(sqlist,val,0);
}
int InsertList_Sq_Tail(SqListPtr sqlist, ElemType val)// 尾插
{
 if(sqlist == NULL) exit(0);
 return InsertList_Sq_Pos(sqlist,val,sqlist->length);
}

int DeleteList_Sq_Pos(SqListPtr sqlist,int pos)//按位置删除
{
 int i=sqlist->length ;
 if(sqlist == NULL) exit(0);
 if(pos<0||pos>=sqlist->length ) return FALSE;
 while(pos< sqlist->length -1)
 {
  sqlist->data[pos] =sqlist->data [pos+1];
  pos++;
 }
 sqlist->length --;
 return TRUE;
}
int DeleteList_Sq_Head(SqListPtr sqlist)//头删
{
 return DeleteList_Sq_Pos(sqlist,0);
}
int DeleteList_Sq_Tail(SqListPtr sqlist) //尾删
{
 return DeleteList_Sq_Pos(sqlist,sqlist->length-1);
}

ElemType * FindElem_Pos(SqListPtr sqlist,int pos)  //按位查找
{
 int i=0;
 if(sqlist==NULL) exit(0);
 if(pos<0||pos>sqlist->length ) return FALSE;
 for(;i<sqlist->length ;++i)
 {
  if(i==pos) return &sqlist->data[i];
 }
 return NULL;
}
void ShowList_Sq(SqListPtr sqlist)
{
 int i=0;
 if(sqlist->length==0)
 {
  printf("\n顺序表为空\n");
 }
 else
 {
  for(;i<sqlist->length;i++)
  {
   printf("%d ",sqlist->data[i]);
  }
 }
 printf("\n");
}

void ClearList_Sq(SqListPtr sqlist)
{
 if(sqlist==NULL) return ;
 sqlist->length =0;
}

int main()
{
 SqList sq;
 int i=0;
 InitList_Sq(&sq);
 for(;i<5;i++)
 {
  InsertList_Sq_Tail(&sq,i);
 }
 ShowList_Sq(&sq);

 InsertList_Sq_Pos(&sq,10,2); //下标从0开始
 ShowList_Sq(&sq);

 InsertList_Sq_Head(&sq,2);
 ShowList_Sq(&sq);

 DeleteList_Sq_Pos(&sq,3);
 ShowList_Sq(&sq);

 printf("第3个位置为%d\n",*FindElem_Pos(&sq,3));
 return 0;
 }

运行结果如下:
图中
    图中运行结果中的位置从0开始。

不定长顺序表

#include<stdio.h>
#include<stdlib.h>

typedef struct SqList
{
 ElemType *data;
 int length;   //当前存储数据的个数
 int listsize;  //存储空间
}SqList,*SqListPtr;

#define TRUE 1
#define FALSE 0

int InitList_Sq_Dyn (SqListPtr sq)
{
 if(sq == NULL) exit(0);
 sq->length =0;
 sq->data = (ElemType *)malloc(INIT_SIZE * sizeof(ElemType));
 if(sq->data ==NULL) return FALSE;
 sq->listsize =INIT_SIZE;
 return TRUE;
}
static int IsFull_SqDyn(SqListPtr sq)
{
 if(sq->data ==NULL||sq->length == sq->listsize)
 {
  return TRUE;
 }
 return FALSE;
}

static int AppendSpace(SqListPtr sq)
{
 //申请更大空间
 ElemType *data =(ElemType *)malloc(sizeof(ElemType)*sq->listsize *2);
 if(data==NULL) return FALSE;
 sq->listsize *=2;
 //拷贝原始空间的数据
 for(int i=0;i<sq->length ;++i)
 {
  data[i]=sq->data [i];
 }
 //释放原始空间
 free(sq->data);
 //将新空间的首地址存储到sq->data上
 sq->data =data;
 return TRUE;
}

int InsertList_SqDyn_Pos(SqListPtr sq,ElemType val,int pos)
{
 if(sq ==NULL) exit(0);
 if(pos<0||pos>sq->length ) return FALSE;
 if(IsFull_SqDyn(sq)&&!AppendSpace(sq))   //表满且扩容失败
 {
  return FALSE;
 }
 for(int i=sq->length ;i>pos;--i)
 {
  sq->data [i]=sq->data [i-1];
 }
 sq->data [pos ]= val;
 sq->length++;
 return TRUE;
}

int DeleteList_SqDyn_Pos(SqListPtr sq,int pos)
{
 if(sq == NULL || sq->data == NULL) return FALSE;
 if(pos<0 || pos>= sq->length ) return FALSE;
 while(pos< sq->length -1)
 {
  sq->data[pos] =sq->data [pos+1];
  pos++;
 }
 sq->length --;
 return TRUE;
}

void ShowList_SqDyn(SqListPtr sq)
{
 if(sq == NULL || sq->data ==NULL) exit(0);
 for(int i=0;i<sq->length;++i)
 {
  printf("%d  ",sq->data [i]);
 }
}

void ClearList_SqDyn(SqListPtr sq)
{
 if(sq==NULL) return ;
 sq->length =0;
}

void DestroyList_SqDyn(SqListPtr sq)
{
 if(sq==NULL) return ;
 free(sq->data );
 sq->data =NULL;//防止野指针
 sq->length =sq->listsize =0;
}

int main()
{
 SqList sq;
 if(!InitList_Sq_Dyn (&sq))
 {
  printf("init error\n");
  return 0;
 }
 for(int i=0;i<10;++i)
 {
  InsertList_SqDyn_Pos (&sq,i,sq.length );
 }
 ShowList_SqDyn (&sq);
 InsertList_SqDyn_Pos(&sq,100,3); //下标均从0开始
 ShowList_SqDyn (&sq);
 DeleteList_SqDyn_Pos(&sq,3);
 ShowList_SqDyn (&sq);
 ClearList_SqDyn(&sq);
 ShowList_SqDyn (&sq);
 return 0;
}

运行结果如下:
在这里插入图片描述

发布了30 篇原创文章 · 获赞 32 · 访问量 959

猜你喜欢

转载自blog.csdn.net/cleverlemon/article/details/103206560