链表的定义插入、删除、初始化等基本操作

数据结构-线性表-链表
---------------------------------------------------- 一些基本操作

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define OK 1
#define ERROR 0
#define True 1
#define False 0
#define MAXSIZE 20



typedef int Status;//函数的返回值类型
typedef int ElemType;//元素类型
//链式存储
typedef struct LNode* LinkList;
typedef struct LNode{
	ElemType Data;
	LinkList Next;
} LNode;


//LNode L; 
//LinkList   PtrL;
Status Length(LinkList PtrL)
{/*求表长*/
	LinkList p = PtrL;
	int j = 0;
	while (p)
	{
		p = p->Next;
		j++;
	}
	return j;

}//O(n)

LinkList FindKth(int k, LinkList PtrL)
{/*按序号查找*/
	LinkList p = PtrL;
	int i = 1;
	while (p && i < k)
	{
		p = p->Next;
		i++;
	}

	if (i == k)
		return p;
	else
		return NULL;
}

LinkList Find(ElemType X, LinkList PtrL)
{
	LinkList p = PtrL;
	while (p != NULL && p->Data != X)
		p = p->Next;
	return p;
}


/*插入一个元素
1.先构造一个新结点
2.在找到链表的第i-1个结点,用p指向
3.修改指针,插入结点*/
Status linkListInsert(ElemType X, int i, LinkList PtrL)
{
	LinkList s, p;
	int k = 1;
	s = (LinkList)malloc(sizeof(struct LNode));//生成一个新的结点
	s->Data = X;

	p = PtrL;
	while (p && k < i - 1)
	{/*查找到第i-1个结点*/
		p = p->Next;
		k++;
	}

	if (!p||k > i - 1)
	{
		printf("参数不合法");
		return ERROR;
	}
	else
	{
		s->Next = p->Next;
		p->Next = s;
	}
	return OK;
}


LinkList linkListInsertway2(ElemType X, int i, LinkList PtrL)
{
	LinkList s, p;
	if (i == 1)
	{
		s = (LinkList)malloc(sizeof(struct LNode));
		s->Data = X;
		s->Next = PtrL;
		return s;
	}
	p = FindKth(i - 1, PtrL);
	if (p == NULL)
	{
		printf("参数不合法");
		return NULL;
	}
	else
	{
		s = (LinkList)malloc(sizeof(LNode));
		s->Data = X;
		s->Next = p->Next;
		p->Next = s;
		return  PtrL;
	}
	p = FindKth(i - 1, PtrL);
	if (p == NULL)
	{
		printf("输入不合法");
		return NULL;
	}
	else if(p->Next==NULL)
	{
		printf("输入不合法");
		return NULL;
	}
	else
	{
		s = p->Next;
		p->Next = s->Next;
		free(s);
		return PtrL;
	}
}


/*删除一个结点,并返回删除结点的值*/


Status LinkListDelete(LinkList PtrL, int i, ElemType X)
{
	LinkList p, q;
	int k=1;
	p = PtrL;
	while (p && k < i - 1)
	{/*找到第i-1个结点*/
		p = p->Next;
		k++;
	}
	if (k > i - 1 && !p->Next)
	{
		printf("输入参数不合法");
		return ERROR;
	}
	else
	{
		q = p->Next;
		p->Next = q->Next;
		X = q->Data;
		free(q);
	}
	printf("删除成功");
	return X;
}
/*删除一个结点,并返回新的链表的指针*/
LinkList Delete(int i, LinkList PtrL)
{
	LinkList s, p;
	if (i == 1)
	{
		s = PtrL;//s指向第一个结点
		if (PtrL != NULL) PtrL = PtrL->Next;//从链表中删除 
		else return NULL;
		free(s);
		return PtrL;
	}
}

/*整张表的创建*/
LinkList CreateList(LinkList Ptrl, int n)
{/*头插法,有头结点*/
	LinkList p;
	int i;
	srand(time(0));//产生随机数种子
	Ptrl = (LinkList)malloc(sizeof(LNode));
	Ptrl->Next = NULL;
	for (i = 0; i < n; i++)
	{
		p = (LinkList)malloc(sizeof(LNode));
		p->Data = rand() % 100 + 1;
		p->Next = Ptrl->Next;
	}
	return Ptrl;
}
LinkList CreateListtailway(LinkList Ptrl, int n)
{/*使用尾插法*/
	LinkList p,r;
	int i;
	srand(time(0));//产生随机数种子
	Ptrl = (LinkList)malloc(sizeof(LNode));
	Ptrl->Data= rand() % 100 + 1;
	r = Ptrl;
	for (i = 0; i < n-1; i++)
	{
		p= (LinkList)malloc(sizeof(LNode));
		p->Data = rand() % 100 + 1;
		r->Next = p;
		r = p;
	}
	r->Next = NULL;
	return Ptrl;
}
/*单链表整个的删除*/
Status ClearList(LinkList PtrL)
{/*带有头结点*/
	LinkList q, p;
	p = PtrL->Next;//指向第一个结点
	while (p)
	{
		q = p->Next;
		free(p);
		p = q;
	}
	PtrL->Next = NULL;
	return OK;

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值