链表知识点

1.动态链表
链表的基本知识已经在c中学过了,这里写一下链表是如何排序的

#include<stdio.h>
#include<stdlib.h>//
struct Id
{
 int a;
 struct Id *next; 
};

struct Id *head()//返回头指针的函数
{
 int n,i;
 scanf("%d",&n);
 struct Id *head,*end,*pnew;//因为new是一个关键字,所以用pnew
 pnew=(struct Id*)malloc(sizeof(struct Id));//第一个节点要特殊处理,所以放在循环外
 scanf("%d",&pnew->a);
 head=end=pnew;
 
 for(i=1;i<n;i++)
 {
  pnew=(struct Id*)malloc(sizeof(struct Id));
  scanf("%d",&pnew->a);
  end->next=pnew;
  end=pnew;
 }
 end->next=NULL;
 struct Id *p=head,*q=head;
 int temp;
 while(n>1)//类似于冒泡排序,俩层循环
 {
  while(p->next!=NULL)
  {
   if(p->a>p->next->a)
   {
    temp=p->a;
    p->a=p->next->a;
    p->next->a=temp;
   }
   p=p->next;
  }
  n--;
  p=head->next;
 }
 return q;//返回头指针
}
int main()
{
 struct  Id *p=head();
 while(p!=NULL)
 {
  printf("%d ",p->a);
  p=p->next;
 }
 return 0;
}

2.循环链表
将单链表中终端结点的指针端由空指针改为头节点,就是整个单链表形成一个换一个环,这种头尾相接的单链表就称为循环链表
单链表转换为循环链表的核心代码
A和B表合并为循环链表

p=rearA->next;//保存A表头节点
rearA->next=rearB->next->next;//将本指向B表的第一个节点(不是头节点)赋值给rearA->next
q=rearB->next;
rearB->next=p;//将原A表的头结点赋值给rearB->next
free(P);

3.双向链表
双向链表是在单链表的每个节点中,在设置一个指向其前驱节点的指针
定义如下

struct NOed
{
	int date;
	struct Noed *prior;
	struct Node *next;
};	

双向链表的插入(注意顺序)

s->prior=p;//p赋值给s的前驱
s->next=p->next;//把p->next赋值给s的后继
p->next->prior=s;//把s赋值给p->next的前驱
p->next=s;//把s的值赋值给p的后继

双向链表的删除

p->prior->next=p->next;//把p->next的值赋值给p->prior的后继
p->next->prior=p->prior;//把p->prior赋值给p->next的前驱
free(p);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值