清华大学-数据结构(c语言版)顺序表代码

线性表:由同类型数据元素构成有序序列的线性结构

1、表中元素个数称为线性表的长度

2、线性表没有元素时,称为空表

3、表起始位置称表头,表结束位置称表尾

 

话不多说,上代码:

/*---------------------------线性表操作集------------------------------------*/
#include <stdio.h>
#include <malloc.h> 
#include <stdlib.h>
#define OK 1		//返回值 
#define ERROR 0		
#define OVERFLOW -1	
typedef int Elemtype;		//数据类型 
typedef int Status;			//返回值类型 

void test1();

//线性表的动态分配顺序存储结构
#define LIST_SIZE 100		//线性表存储空间的起始分配量 
#define LIST_RE_SIZE 100	//线性表存储空间的扩展量 
typedef struct SqList{
	Elemtype *Elem;		//存储空间的基地址 
	int length;			//当前的长度 
	int listsize; 		//当前分配的存储量大小 
}SqList;

//创建一个空的线性表 
Status Init_SqList(SqList *L){
	//传入一个新建的线性表,给线性表申请空间
	 
	L->Elem=(Elemtype*)malloc(LIST_SIZE*sizeof(Elemtype));//申请空间 
	if(!L->Elem)	return OVERFLOW;						//申请失败,退出 
	L->length=0;											//当前长度为0 
	L->listsize=LIST_SIZE;								//当前容量为0 
	return OK; 
}

//往线性表中插入一个元素
Status Insert_SqList(SqList *L,Elemtype e,int i){
	//传入一个线性表、想要传入的数据和位置
	//在顺序线性表L中第i个位置之前插入一个新的元素e
	
	Elemtype *newList;
	int *p;												//指向要插入的位置			
	int *q;
	
	//查看i是否合法 
	if(i<1||i>L->length+1)	return ERROR;				//i不合法 
	
	//查看存储空间是否已满 
	if(L->length>L->listsize)	{						//当前的存储空间已满,需要增加分配 
		newList=(Elemtype*)realloc(L->Elem,(L->length+LIST_RE_SIZE)*sizeof(Elemtype));	//增加分配
		if(!newList)	return OVERFLOW;				//空间分配失败
		L->Elem=newList;
		L->listsize+=LIST_RE_SIZE; 
	}
	
	//找到要插入元素的位置并且插入 
	p=&(L->Elem[i-1]);									//p为插入元素的位置 
	for(q=&(L->Elem[L->length-1]);p<=q;--q){			//遍历插入位置 之后的数据	
		*(q+1)=*q;										//往后移动一格 
	}
	*p=e;
	++L->length;
	return OK; 
} 

//在顺序表里删除一个元素
Status Delete_SqList(SqList *L,Elemtype *e,int i){
	//传入一个顺序表、要删除的数据的位置 
	//用e把删除的数据带出来
	
	Elemtype *p;
	Elemtype *q; 
	
	//判断i是否合法
	if(i<1||i>L->length)	return ERROR;				//i不合法
	
	//找到要删除的元素
	p=&(L->Elem[i-1]);									//p为要删除的元素			
	*e=*p;
	q=&(L->Elem[L->length-1]);
	p++;
	for(p;p<q;++p){
		*(p-1)=*p;
	}
	--L->length;
	return OK; 
} 

//合并两个顺序表
Status Merge_SqList(SqList La,SqList Lb,SqList *Lc){
	//已知顺序线性表La和Lb的元素按值非递减排序 
	//归并La和Lb得到新的顺序线性表Lc,Lc的元素也是按值非递减排序
	
	Elemtype *pa,*pa_last;
	Elemtype *pb,*pb_last;
	Elemtype *pc;
	
	//初始化各参数
	pa=La.Elem;
	pb=Lb.Elem;
	pa_last=La.Elem+La.length-1;
	pb_last=Lb.Elem+Lb.length-1; 
	Lc->listsize=Lc->length=La.length+Lb.length;
	pc=Lc->Elem=(Elemtype*)malloc(Lc->listsize*sizeof(Elemtype));
	
	//判断内存是否分配成功
	if(!Lc->Elem)	return OVERFLOW;
	
	//归并
	while (pa<=pa_last&&pb<=pb_last){
		if(*pa<=*pb)	*pc++=*pa++;
		else *pc++=*pb++;
	} 
	while(pa<=pa_last){
		*pc++=*pa++;
	}
	while(pb<=pb_last){
		*pc++=*pb++;
	}
	return OK;
} 

//主函数 
int main(void){
	test1();
	system("pause");
	return 0;
} 

//测试代码1 
void test1(){
	SqList q,p,f;
	int a;
	if(Init_SqList(&q))	printf("OK\n");
	if(Insert_SqList(&q,22,1)) printf("Write OK\n");
	printf("%d\n",q.Elem[0]);
	if(Delete_SqList(&q,&a,1));
	printf("%d\n",a); 
	if(Insert_SqList(&q,244,1)) printf("Write OK\n");
	if(Init_SqList(&p))	printf("OK\n");
	if(Insert_SqList(&p,344,1)) printf("Write OK\n");
	if(Init_SqList(&f))	printf("OK\n");
	if(Merge_SqList(p,q,&f))	printf("%d %d\n",f.Elem[0],f.Elem[1]);
}

如果使用vscode,需要加上头文件和特定函数

#include <stdilb>

int main(){
    /*代码*/
    system("pause");
}

实现: 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值