链表入门基础知识

//建立空的顺序表
List MakeEmpty()
{
	List ptrl;
	ptrl = (List)malloc(sizeof(struct Lnode));
	ptrl.last = -1;
	return ptrl;
}
//查找,最少1次找到,最多n次,查找成功的平均比较次数为(n+1)/2,平均时间性能为o(n)
int find(elementtype x, List ptrl)
{
	int i = 0;
	while (i <= ptrl.last && ptrl.Data[i] != x)
		i++;
	if (i > ptrl->Last) return -1;//没找到,返回-1
	else return i;//找到了,返回存储位置
}
//插入,在第i(i>1,i<n+1)个位置上插入一个值为x的新元素
void insert(elementtype x, int i, List ptrl)
{
	int j;
	if (prtl->Last == maxsize - 1) {
		//表空间已满,不能插入
		printf("表满");
		return;
	}
	if (i<1 || i>ptrl->Last + 2) {
		//检查插入位置的合理性
		printf("位置不合法");
			return;
	}
	for (j = ptrl->Last; j >= i - 1; j--)//平均移动次数n/2.平均时间性能o(n)
		ptrl->Data[j + 1] = ptrl.Data[j];//将a1-an倒序向后移动
	ptrl->Data[i - 1] = x;//新元素插入
	ptrl->Last++;//last仍然指向最后元素
	return;
}
//删除  删除表中的第i,i>1,i<n位置上的元素
void deletee(elementtype x, int i, List ptrl)
{
	int j;
	if (i<1 || i>ptrl->Last + 1) {
		//检查删除位置的合理性
		printf("不存在第%d个元素",i);
		return;
	}
	for (j = i; j <= ptrl->Last; j++)//平均移动次数n-1/2.平均时间性能o(n)
		ptrl->Data[j - 1] = ptrl.Data[j];//将ai+1-an顺序向前移动
	ptrl->Last--;//last仍然指向最后元素
	return;
}

int Length(List ptrl)//时间o(n),,,求长度
{
	List p = ptrl;//p指向表的第一个结点
	int j = 0;
	while (p) {
		p = p->Next;
		j++;//当前p指向的是第j个结点
	}return j;
}
//查找
//1、按序号查找
List Findkth(int k, List ptrl)
{
	List p = ptrl;
	int i = 1;
	while (p != NULL && i < k) {
		p = p->Next;
		i++
	}
	if (i == k)return p;//找到第k个,返回指针
	else return NULL;//否则返回空
}
//2按值查找,平均时间性能为o(n)
List Find(Elementtype x, List ptrl) {
	List p = ptrl;
	while (p != NULL && p->Date != x)
		p = p->Next;
	return p;
}
//插入,在第i-1,(i>1,i<n+1)个结点后插入一个值为x的新节点
//1、先构造一个新节点,用s指向
//2、再找到链表的第i-1个结点,用p指向;
//3、修改指针,插入节点(p之后插入新结点s)
List Insert(Elementtype x, int i, List Ptrl)//平均查找次数n/2
{
	List p, s;
	if (i == 1) {//新节点插入在表头
		s = (List)malloc(sizeof(struct LNode));//申请填装结点
		s->Data = x;//????????
		s->Next = prtl;//???????
		return s;
	}
	p = Findkth(i - 1, ptrl);//查找第i-1个结点
	if(p == NULL){//第i-1个不存在,不能插入
		printf("参数i错");
			return NULL;
	}
	else {
		s = (List)malloc(sizeof(struct LNode));
		s->Data = x;
		s->Next = p->Next;//新节点插入在第i-个节点的后面
		p->Next = s;
		return ptrl;
	}
//删除,删除链表的第i个位置上的节点
	//1、先找到链表的第i-个结点,用P指向;
	//用指针s指向被删除的结点(p的下一个节点);
	//然后修改指针,删除s所指结点
	//释放s所指节点的空间free
	//平均时间复杂度n/2
	List Delete(int i, List ptrl)
	{
		List p, s;
		if (i == 1) {//若要删除的是表的第一个结点
			s = ptrl;//s指向第一个节点
			if (ptrl != NULL)ptrl = ptrl->Next;//从链表中删除
			else return NULL;
			free(s);//释放被删除节点
			return ptrl;
		}
		p = Findkth(i - 1, ptrl);//查找第i-个结点
		if (p == NULL) {
			printf("第%d个节点不存在",i - 1);
			return NULL;
		}
		else if (p->Next == NULL) {
			printf("第%d个节点不存在",i);
			return NULL;
		}
		else {
			s = p->Next;//s指向第i个结点
			p->Next = s->Next;//从链表中删除
			free(s);//释放
			return ptrl;
		}
}




}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值