线性表的插入,删除,合并,查找

数据结构简答的线性表的插入,删除,合并,输出地址,可能会有错误,希望大家修正

线性表示数据结构中较为重要的一个结构,实现增删查改,主要参考严版的数据结构,以下为代码部分

// listSq.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <malloc.h>
using namespace std;
#define list_init_size 100 //init size
#define listincerment 10 //increment
//----动态分配顺序存储结构---
typedef struct{
	int *elem;
	int length;
	int listsize;
}SqList;

//---实现插入操作---
SqList InitList_Sq(SqList &La,int i, int e){//La的第i个位置插入元素e,这里是整形,可以换成string类型
	if (i<1 || i>La.length + 1)//i不合法
		return La;
	else if (La.length >= La.listsize){//当前存储空间已满,增加分配
		La.elem = (int *)realloc(La.elem, (La.listsize + listincerment)*sizeof(int));
		if (!La.elem)
			exit(OVERFLOW);//存储分配失败
		La.listsize += listincerment;//增加存储容量
	}
	int* q;//q为插入位置
	int* p;//p为往后移元素位置
	q = &(La.elem[i - 1]);
	for (p = &La.elem[La.length - 1]; p >= q;--p)//p为最后的元素
	*(p+1)=*p;//元素后移,插入一次,后移一次
	 *q = e;
	 ++La.length;
	 return La;
}

//---实现删除操作---
SqList DeleList_Sq(SqList &La, int i, int &e){//La的第i个位置删除元素e,这里是整形,改元素为地址,主要是删除地址
	if (i<1 || i>La.length + 1)//i不合法
		return La;
	int* p;
	int* q;
	p = &La.elem[i - 1];
	e = *p;//将该元素地址占用,拷贝赋值
	q = La.elem + La.length - 1;
	for (++p; p <= q; ++p)
		*(p - 1) = *p;
	--La.length;
	return La;
}

//---实现查找操作
int LocateElem_Sq(SqList L, int e){
	int i = 1;
	int* p = L.elem;
	while (i<=L.length&&*p++!=e){
		++i;
	}
	if (i <= L.length)
		return i;
	else
		return 0;
}

//---实现两个链表合并操作
SqList MergeList_Sq(SqList La, SqList Lb, SqList &Lc){
	//这里先不实现排序,假设我们已知顺序表La,Lb元素按值得非递减排列
	int* pa;
	int* pb;
	int* pc;
	pa = La.elem;//指向链表的第一个元素
	pb = Lb.elem;
	Lc.listsize = La.listsize + Lb.listsize;
	Lc.length = La.length + Lb.length;
	Lc.elem = (int*)malloc(Lc.listsize*sizeof(int));
	pc = Lc.elem;
	if (!Lc.elem)
		exit(OVERFLOW);
	int* pa_last;
	int* pb_last;
	pa_last = La.elem + La.length - 1;
	pb_last = Lb.elem + Lb.length - 1;
	while (pa <= pa_last&&pb <= pb_last){
		if (*pa <= *pb)
			*pc++ = *pa++;
		else
			*pc++ = *pb++;
	}
	while (pa < pa_last)//插入剩余的La元素
	{
		*pc++ = *pa++;
	}
	while (pb < pb_last)//插入剩余的Lb元素
	{
		*pc++ = *pb++;
	}
	return Lc;
}

int _tmain(int argc, _TCHAR* argv[])
{
	SqList la;
	la.elem = (int *)malloc(list_init_size*sizeof(int));
	if (!la.elem)
		exit(OVERFLOW);
	la.length = 10;
	la.listsize = list_init_size;
	for (int i = 2; i <= 10; ++i)
		InitList_Sq(la, i, i);
	int j = 9;
	cout << &la.elem[17];
	system("pause");
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值