数据结构之顺序表

近期在重温数据结构,做了下总结,内容持续更新中。。。。。

//数据结构之顺序表
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
typedef struct sqlist
{
	int *data;
	int length;
	int size;
}Sqlist;
void swap(int *a,int *b)
{
	int temp;
	temp=*a;
	*a=*b;
	*b=temp;
}
//初始化一个顺序表,返回1代表初始化成功,0表示是失败
int Sqlistinit(Sqlist *sql)
{
	sql->data=(int *)malloc(sizeof(int)*MAX);
	if(sql->data==NULL)
		exit(0);
	sql->size=MAX;
	sql->length=0;
	return 1;
}
//判断顺序表是否为空
int Sqlistisempty(Sqlist  *sql)
{
	if(sql->length==0)
		return 1;
	else 
		return 0;
}	
//在第loc个元前插入元素a,返回1代表插入成功,0代表失败
int Sqlistinsert(Sqlist *sql,int a,int loc)
{
	int i=0;
	if(loc<1||loc>sql->length+1)
	{
		printf("参数不正确");
		return 0;
	}
	if(sql->length>=sql->size)
	{
		sql->data=(int *)realloc(sql->data,sizeof(int)*(sql->size+MAX));
		sql->size+=MAX;
	}
	for(i=sql->length-1;i>=loc-1;i--)
	{
		sql->data[i+1]=sql->data[i];
	}
	sql->data[loc-1]=a;
	sql->length++;
	return 1;
}

//删除第i个元素,返回1表示成功,0表示失败
int Sqlistdelete(Sqlist *sql,int loc)
{
	int i=0;
	if(i<1||i>sql->length)
	{
		printf("参数不正确");
		return 0;
	}
	for(i=loc;i<sql->length;i++)
	{
		sql->data[i-1]=sql->data[i];
	}
	sql->length--;
	return 1;
}
//获取第i个元素,返回第i个元素的值
int Sqlistgetelem(Sqlist *sql,int i)
{
	if(i<1||i>sql->length)
	{
		printf("参数不正确");
		return 0;
	}
	return sql->data[i-1];
}
//顺序表的排序,从小到大排序
void Sqlistsort(Sqlist *sql)
{
	int i=0,j=0;
	if(Sqlistisempty(sql)==1)
	{
		printf("顺序表为空");
		exit(0);
	}
	for(i=0;i<sql->length;i++)
	{
		for(j=i+1;j<sql->length;j++)
		{
			if(sql->data[j]<=sql->data[i])
				swap(&sql->data[j],&sql->data[i]);
		}
	}
}
//合并两个已经排序好的顺序表,保持从小到大的顺序
void Sqlistmerge(Sqlist *sql1,Sqlist *sql2,Sqlist *sql)
{
	int i=0,j=0,k=0;
	sql->length=sql1->length+sql2->length;
	for(;i<sql1->length&&j<sql2->length;)
	{
		if(sql1->data[i]<=sql2->data[j])
		{
			sql->data[k]=sql1->data[i];
			i++;
			k++;
		}
		else
		{
			sql->data[k]=sql2->data[j];
			j++;
			k++;
		}	
	}
	if(i==sql1->length)
	{
		for(;j<sql2->length;)
		{
			sql->data[k]=sql2->data[j];
			k++;
			j++;
		}
	}
	if(j==sql2->length)
	{
		for(;i<sql1->length;)
		{
			sql->data[k]=sql1->data[i];
			k++;
			i++;
		}
	}
}

//销毁一个顺序表
void Sqlistdestory(Sqlist *sql)
{
	free(sql->data);
}

//顺序表已经存在,置空顺序表
void Sqlistcreate(Sqlist *sql,int n)
{
	int i=0;
	for(i=0;i<n;i++)
	{
		scanf("%d",&sql->data[i]);
		sql->length++;
	}
}
//以此输出顺序表里面的元素
void Sqlistdisplay(Sqlist *sql)
{
	int i=0;
	if(Sqlistisempty(sql)==1)
	{
		printf("表为空");
		exit(1);
	}
	for(i=0;i<sql->length;i++)
	{
		printf("%d ",sql->data[i]);
	}
	printf("\n");
		
}
void main()
{
	Sqlist sql1,sql2,sql3;
	Sqlistinit(&sql1);
	Sqlistinit(&sql2);
	Sqlistinit(&sql3);
	printf("sql is empty ?%d\n",Sqlistisempty(&sql1));
	Sqlistcreate(&sql1,5);
	printf("sql:");
	Sqlistdisplay(&sql1);
	Sqlistcreate(&sql2,7);
	printf("sql2:");
	Sqlistdisplay(&sql2);
	printf("sql is empty ?%d\n",Sqlistisempty(&sql1));
	Sqlistinsert(&sql2,7,5);
	printf("after insert sql2:");
	Sqlistdisplay(&sql2);
	printf("after sorted sql1:");
	Sqlistsort(&sql1);
	Sqlistdisplay(&sql1);
	printf("after sorted sql2:");
	Sqlistsort(&sql2);
	Sqlistdisplay(&sql2);
	printf("after merge sql3:");
	Sqlistmerge(&sql1,&sql2,&sql3);
	Sqlistdisplay(&sql3);
}

  

posted @ 2013-05-27 20:49  zxjay  阅读(135)  评论(0编辑  收藏  举报