顺序表的常用操作----

顺序表的增删查改,附加两个有序表的合并

----程序中容易出错的地方

      ·1.每次循环的边界条件。

      ·2.每次进行插入删除操作容易忘记对表标量值的修改。

----特别注意的地方:

      ·1.结构定义时用的数据域用的指针,这时内存大小可以用malloc或者realloc改变。

               但是用数组时是不能进行修改的(不可修改的左值),涉及到数组和指针的区别

      ·2.!!!程序结束之前一定要free

 

 

 


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


#define   MAX_SIZE 100
typedef int ElemType;

typedef struct {
	ElemType * Array ;
	int length;
}SeqList;

SeqList* init()
{
	SeqList* list = (SeqList*)malloc(sizeof(SeqList));
	if (list == NULL)
	{
		printf("malloc error\n");
	}
	list->Array = (ElemType*)malloc(MAX_SIZE * sizeof(ElemType));
	list->length = 0;
	return list;
}
/*---------------插入---------------------*/

void insert(SeqList* list,int i,ElemType val)
{
	if (list != NULL&&list->Array != NULL)
	{
		if (i > 0 && i <= list->length+1) {
			/*移动元素*/
			for (int j = list->length - 1;j >= i-1;j--) {
				list->Array[j + 1] = list->Array[j];
			}
			list->Array[i - 1] = val;
			list->length++;
			return;
		}
		printf("insert error\n");
	}
	printf("insert error\n");
}

void print(SeqList* list)
{
	/*------------遍历顺序表-------------*/
	if (list == NULL||list->length == 0) {
		printf("表为空\n");
	}
	for (int i = 0;i < list->length;i++) {
		printf("%4d", list->Array[i]);
	}
	printf("\n");
}

void freeList(SeqList* list)
{
	if (list != NULL) {
		if (list->Array != NULL) {
			free(list->Array);
		}
		free(list);
	}
}

/*-------------删除--------------*/
void deleteList(SeqList* list ,int i,ElemType* e)
{
	if (list != NULL&&list->length > 0&&i>0&&i<=list->length){
		*e = list->Array[i - 1];
		for (int j = i - 1;j < list->length - 1;j++)
		{
			list->Array[j] = list->Array[j + 1];
			
		}
		--list->length;
		return;
	}
	printf("delete error\n");
}


/*-----------------查找定位删除-------------*/
void locat_delete_list(SeqList* list, ElemType val)
{
	if (list != NULL&&list->length > 0) {
		for (int i = 0;i < list->length-1;i++)
		{
			if (val == list->Array[i]) {
				for (int j = i;j < list->length - 1;j++)
				{
					list->Array[j] = list->Array[j + 1];
					
				}
				list->length--;
				return;
				/*如果要删除所有时
				continue;
				*/
			}
		}
	}
}


/**************两个有序顺序表的合并*****************/
void MergeList(SeqList* La, SeqList* Lb, SeqList* Lc)
{
	
	int* pa;int * pb;int*  pc;
	int* pa_last, pb_last;
	pc = Lc->Array;
	
	Lc->Array=(int *)realloc(pc,(La->length + Lb->length)*sizeof(int));/*重新分配空间*/
	Lc->length = La->length + Lb->length;
	pa = La->Array;
	pb = Lb->Array;
	pa_last = La->Array + La->length - 1;
	pb_last = Lb->Array + Lb->length - 1;
	while (pa < pa_last&&pb < pb_last)
	{
		if (*pa <*pb) {
			*pc = *pa;
			pa++;pc++;
		}
		else {
			*pc = *pb;
			pb++;pc++;
		}
	}
	while (pa <= pa_last) {
		*pc = *pa;
		pa++;pc++;
	}
	while (pb <= pb_last) {
		*pc = *pb;
		pb++;pc++;
	}
}

int main()
{
	
	insert(list, 0, 1);
	//insert(list, 1, 1);
	//insert(list, 2, 2);
	//insert(list, 3, 3);
	//insert(list, 4, 4);
	//print(list);

	///*int e = 0;
	//deleteList(list,2,&e);
	//printf("%d is delete\n", e);

	//print(list);*/
	//locat_delete_list(list, 2);

	//print(list);



	SeqList* la = init();
	SeqList* lb = init();
	SeqList* lc = init();
	for (int i = 0;i < 6;i++)
	{
		
		insert(la, i+1, i+3);
	}
	print(la);
	for (int i = 0;i < 6;i++)
	{
	
		insert(lb, i + 1, i + 4);
	}
	print(lb);

	MergeList(la, lb, lc);
	print(lc);



	freeList(la);
	freeList(lb);
	freeList(lc);


	while (1);
	return 0;
}


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值