线性表------顺序存储

1.线性表的定义:   0个或多个数据元素的有限序列。 元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。

2.线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。

线性包的顺序存储代码: 

1.线性表的基本定义:

#define MAXSIZE 20
typedef in ElemType; // ElemType 类型根据实际情况而定,这里假设为int*
typedef struct
{
    ElemType data[MAXSIZE];    //数据存储元素,最大为MAXSIZE
    int length;  // 线性表的当前长度
}SqList

线性表长度和数组长度的区别:

2.创建线性表和打印输出线性表:

//创建一个长度为n的线性顺序表
void createSqlist(SeqList &L,int n)
    {
        print("请输入%d个数:\n",n);
        for(int i=0;i<n;i++)
            {
                scanf("%d",&L.data[i]);
            }
            L.len = n;
     }
//打印输出线性表
void printSqList(SqList L)
{
    printf("打印线性表:");
    for(int i = 0; i<L.len; i++)
    {
        printf("%d",L.data[i]);
    }
    printf("\n");
}
    
void main()
{
    //初始化一个空线性表
    SqList L;
    L.len=0;

    createSqList(L,5);
    printSqList(L);
}

插入元素:(注意一步容错)

void insertSqList(SqList &L, int i, ElemType e) {
	if (i<1) 
	{
		printf("插入位置参数不合法");
	}
	else if (L.len >= MAXSIZE) 
	{
		printf("表已满,无法差插入");
	}
	else if (i > L.len)
	{
		//容错插入位置比线性表长
			i = L.len;
			L.data[i] = e;
			L.len++;
	}
	else
	{
		int j = L.len - 1;
		for (j; j >= i - 1; j--) {
			L.data[j + 1] = L.data[j];//从后往前移动元素
		}
		L.data[i-1] = e;
		L.len++;
	}
}

删除元素:

//删除元素   不传删除元素
void delSqList(SqList&L, int i)
{
	if (i > L.len || i < 1)
	{
		printf("删除位置不合法");
	}
	int j = i - 1;//删除元素的下标
	ElemType e;
	e = L.data[j];
	printf("删除的第%d位置的元素数据是%d\n", i, e);
	for (j; j < L.len - 1; j++)
	{
		L.data[j] = L.data[j + 1];
	}
	L.len--;
}

//传删除的元素
//删除第i(1<=i<=L.len)个元素,并用e返回其值
//时间复杂度:O(n)
void delSqList(SqList &L, int i, ElemType &e){
	if(i>L.len||i<1)
    {
		printf("删除位置参数不合法");
	}
	int j = i-1;//j是要被删除元素的下标
	e = L.data[j];
	printf("删除的第%d位置的数据是%d\n",i,e);
	for(j;j<L.len-1;j++)
    {
		L.data[j] = L.data[j+1];
	}
	L.len--;
}

获取某位置的元素:

//获取某位置的元素
int getSqList(SqList &L, int i)
{
	if (i < 0||i>=L.len)
	{
		printf("位置不合法");
		return 0;
	}
	if (i < L.len)
	{
		return L.data[i - 1];
	}
}

主函数:

void main()
{
	//初始化一个空线性表
	SqList L;
	L.len = 0;

	createSqlist(L, 5);
	printSqList(L);


	//完成插入功能
	printf("您要插入的数据和位置(1~%d)(如:在第2个位置插入10则输入:10,2):", L.len);
	int elem, pos;
	scanf("%d,%d", &elem, &pos);
	insertSqList(L, pos, elem);
	printSqList(L);

	//用插入来创建线性表
	createUseInsertSqList(L, 6);
	printSqList(L);

	//完成删除功能
	printf("您要删除的数据的位置(如:要删除第2个位置的数据则输入(1~%d):2):", L.len);
	int pos;
	ElemType elem;
	scanf("%d", &pos);
	delSqList(L, pos);
	printSqList(L);


	//获取元素
	int a, i;
	printf("输入获取位置\n");
	scanf("%d", &i);
	a = getSqList(L, i);
	printf("第%d的元素是%d", i, a);

	system("pause");

}

=========================================================================================

升级版:

按顺序合并两个线性表:(未去重)                                      后面的去重

//按顺序合并两个顺序表
void mergeSqList(SqList La, SqList Lb, SqList &Lc)
{
	int i = 0, j = 0;
	Lc.len = La.len + Lb.len;
	int k = 0;
	while (i < La.len && j < Lb.len)
	{
		if (La.data[i] <= Lb.data[j])
		{
			Lc.data[k] = La.data[i];
			i++;
			k++;
		}
		else
		{
			Lc.data[k] = Lb.data[j];
			j++;
			k++;
		}
	}
	while (i<La.len) {
		Lc.data[k] = La.data[i];
		i++;
		k++;
	}
	while (j<Lb.len) {
		Lc.data[k] = Lb.data[j];
		j++;
		k++;
	}
}
//合并两个线性没重复
int locateElem(SqList L, ElemType e)//比较e是否在L中
{
	int i = 1;//位置
	while (i <= L.len && L.data[i-1] != e)
	{
		i++;
	}
	if (i <= L.len)
		return i;
	else
		return 0;
}

void unionSqList(SqList &La, SqList Lb)
{
	for (int i = 0; i < Lb.len; i++)
	{
		ElemType e = Lb.data[i];
		if (!locateElem(La, e))//e不在La中
		{
			insertSqList(La, La.len+1, e);
		}
	}
}

参考资料:

  1. 《大话数据结构》
  2.   大神博客:https://blog.csdn.net/u010366748/article/details/50632131

猜你喜欢

转载自blog.csdn.net/qq_39503189/article/details/81390696