欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

顺序表的 C 语言实现

程序员文章站 2022-03-15 09:50:45
...
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define OVERFLOW 0
#define ERROR -1
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType;
typedef struct 
{
//	定义数组存储数据元素的最大值 
	char *elem;
//	定义线性表当前长度 
	int length;
//	线性表的长度
	int listsize; 
}SqList;

//	线性表的初始化
int InitList(SqList &L)
{
	L.elem = (char *)malloc(LIST_INIT_SIZE*sizeof(char));
	if(!L.elem)
		exit(OVERFLOW);
		
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
	return OK;
 } 
 
// 插入
int ListInsert_Sq(SqList &L,int i,char e)
{
//	i 是要插入的位置 
//	如果要插入的位置不在顺序表的范围内就报错 
	if(i<1 || i>L.length)
	{
		return ERROR;
	}
	
	char *newbase;
	char *p , *q;
//	如果当前长度大于了最大长度就重新分配新的空间 
	if(L.length >= L.listsize)
	{
		newbase = (char*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(char));
		if(!newbase)
			exit(OVERFLOW);
		L.elem = newbase;
		L.listsize += LISTINCREMENT;
	}
	
//	插入操作

//	q 为第 i 个元素的位置 ,即要插入的元素的位置 
q = &(L.elem[i-1]); 

//	从后往前遍历,把 i 后的每一个元素都后移一位 
for(p=&(L.elem[L.length - 1]);p>=q;p--)
{
	*(p+1) = *p;
}

//	把要插入的元素放到 i 这个位置 
*q = e;

//顺序表当前长度增加一个 
L.length++;

return OK;
 } 
 
// 删除
int ListDelet_Sq(SqList &L,int i)
{
	int k; 
	
	if(i<1 || i>L.length)
	{
		return ERROR;
	}

	if(i<L.length)
	{
		for(k=i;k<L.length;k++)
		{
			L.elem[k-1] = L.elem[k];
		}
	}
	

	
	L.length--;
	return OK;
 } 
 
// 查找
// x 为查找的值 
int LocateElem_Sq(SqList L,char x)
{
	int i = 1;
	char *p;
 	p = L.elem;
 	while(i<L.length)
 	{
 		if(*p == x)
 			break;
 		else
 			p++;
 			i++;
	 }
	 
//	 返回这个位置 
	printf("%d 的位置是 %d\n",x,i);
 } 
 
// 显示当前顺序表的数值
void show(SqList L)
{
	int i;
	printf("当前顺序表的数值情况:\n");
	for(i=0;i<L.length;i++)
	{
		printf("%d ",L.elem[i]);
	}
	printf("\n");
 } 
 
 main()
 {
 	int y;
 	SqList L;
 	y = InitList(L);
 	if(y == 1)
 		printf("success init\n");
 		
// 	先给顺序表赋值
	for(int i=0;i<10;i++)
	{
		L.elem[i] = i;
		L.length ++ ;		
	}
	
	show(L);
 
// 	查找一个数字 8 ,并返回它的位置
	 LocateElem_Sq(L,8); 
	 
//	 插入一个数字 10 到第八位置
	ListInsert_Sq(L,8,10);
	show(L); 
	
//	删除一个数字 10  
	 ListDelet_Sq(L,8);
	 show(L); 
	
//	这个是地址 
//	 printf("%d\n",L);


 }
 
 
相关标签: 顺序表