链表(Linked List)(~ ̄▽ ̄)~

主要操作的实现

1.初始化(建立空的顺序表)

List MakeEmpty()
{
	List Ptrl;
	Ptrl = (List)malloc(sizeof(struct LNode));
	Ptrl->Last = -1;
	return Ptrl;
}

2.查找

int Find(ElementType X, List Ptrl)
{
	int i=0;
	while(i <= Ptrl->Last && Ptrl->Data[i] != X)
	{
		i++;
	}
	if(i > Ptrl->Last) return -1;
	else return i;
}

3.插入

void Insert(ElementType X,int i,List Ptrl)
{
	int j;
	if(Ptrl->Last == MAXSIZE-1)
	{
		printf("表满");
		return; 
	}
	
	if(i<1 || i>Ptrl->Last+2)
	{
		printf("插入位置不合法");
		return;
	}
	
	for(j = Ptrl->Last; j>=i-1; j--) //i-1是第i个数 
	{
		Ptrl->Data[j+1] = Ptrl->Data[j]; //Aj往后 倒序向后移动1 
	}
	Ptrl->Data[i-1] = X;
	Ptrl->Last++;
	
	return; 
	
}

4.删除

void Delete(int i,List Ptrl)
{
	int j;
	if(i<1 || i > Ptrl->Last+1)
	{
		printf("不存在第%d个元素",i);
		return;
	}
	for(j = i; j <= Ptrl->Last; i++)
	{
		Ptrl->Data[j-1] = Ptrl->Data[j];//Aj+1~An顺序向前移动 
	}
	Ptrl->Last--;
	
	retrun;
 } 

5.主要操作的实现

(1)求表长

//求表长 
  int Length(List Ptrl)
  {
 	List p = Ptrl; //p指向链表的第一个结点 
 	int j = 0;
 	while(p)
 	{
 		p = p->Next;
 		j++; // 此时p指向第j个结点 
	 }
	return j;
  }

(2)查找(按值/按序号查找)

//按序号查找
  List FindKth(int K, List Ptrl)
  {
  	int i=1;
  	List p = Ptrl;
	while(i<K && p !=NULL) //注意是&& 不是|| 
	{
		p = p->Next;
		i++;
	 } 
	 if(i == K) return p;
	 else return NULL;
  }
//按值查找 
  List Find(ElementType X, List Ptrl)
  {
  	List p = Ptrl;
  	while(p->Data != X && p !=NULL) //注意是&& 不是|| 
  	{
  		p = p->Next;
	  }
	  
	return p; //如果没有找到的话,p就是NULL 
  	
  }

(3)插入

1.先构造一个新结点,用s指向

2.再找到链表的第i-1个结点,用p指向

3.然后修改指针,插入结点(p之后插入新结点s)

s->Next = p->Next;

p->Next = s;

(顺序不能改变!)

//插入新结点
  List Insert(ElementType X, int i, List Ptrl)
  {
  	List p,s;
  	if(i==1) //判断新结点是否插在表头 
  	{
  		s = (List)malloc(sizeof(struct LNode)); //分配空间 
  		s->Data = X;//赋值 
  		s->Next = Ptrl;//别忘了把后面的链表链上去ヾ(·ω~)o 
  		return s; //表头不再是Ptrl,s才是新表头 
	  }
	  
	  p = FindKth(i-1, Ptrl); //之前写的查找函数
	  if(p == NULL) //判断结点插入位置是否在链表内 
	  {
	  	printf("插入位置不合法");
		 return NULL; 
	   } else
	   {
	   	s = (List)malloc(sizeof(struct LNode)); //申请、填装结点
		s->Data = X;
		s->Next = p->Next; //新结点插入在第i-1个结点的后面 
		p->Next = s;
		return Ptrl; 
	   }
   } 

(4)删除(删除链表的第i个位置上的结点(1<=i<=n)

1.先找到链表的第i-1个结点,用p指向;

2.在用指针s指向p的下一个结点(要被删除的结点);

3.然后修改指针,删除s所指向的结点;

4.最后释放s所指结点的空间。

 //删除
   List Delete(int i,List Ptrl)
   {
   	List p,s;
   	if(i == 1) //如果删除的是表头 
   	{
   		s = Ptrl;
   		if(Ptrl != NULL) Ptrl = Ptrl->Next; //判断表头是否为空 ,不为空则表头指向第二个结点 
   		else return NULL;
		free(s);
		return Ptrl; 
	   }
	   
	p = FindKth(i-1, Ptrl);
	
	if(p == NULL) //判断第i-1个结点是否为空 
	{
		printf("第%d个结点不存在",i-1);
		return NULL;
	}else if(p->Next == NULL) //判断第i个结点是否为空 
	{
		printf("第%d个结点不存在",i);
		return NULL;
	}else
	{
		s = p->Next;
		p->Next = s->Next;
		free(s); //释放结点空间
		return Ptrl; 
	 } 
	} 

6.广义表和多重链表

(1)用“复杂”链表表示二元多项式

(2)广义表

①是线性表的推广

②对线性表来说,n个元素都是基本的单元素

③对广义表来说,这些元素不仅可以是单元素,也可以是另一个广义表

(3)多重链表

链表的结点可能同时隶属多个链。

①结点的指针域会有多个

②但是,包含两个指针域的链表不一定是多重链表,比如:双向链表不是多重链表

③在树、图等复杂结构中有广泛应用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值