链表(单向,循环,双向)

目录

一,单向链表

1)结点的设置

2) 创建一个单向链表 

1.头插法(特点:与输入数据的顺序相反储存)

2.尾插法(特点:与输入数据的顺序相同)

3)单链表结点的删除 

4)单链表的释放(唯一移动头指针的类型)

二,循环链表 (能访问链表中某一结点前面的数据)

三, 双向链表

1)结点设置


一,单向链表

1)结点的设置

typedef struct node {
	int data;          //数据域
	struct node *next; //指针域
    //双向链表要添加 struct node *prior;
} Node, *Link;

malloc是一个返回类型为void*的函数 ,第一个括号是强制类型转换成p类型的指针,并且声明指向的内存类型;第二个括号是指向的内存有多大

p=(Link)malloc(sizeof(Node));

2) 创建一个单向链表 

1.头插法(特点:与输入数据的顺序相反储存)

Link newList1(int a[], int n){//返回指针的函数
   Link head;
   head=(Link)malloc(sizeof(Node));
   head->next=NULL;
   for(int i=0;i<n;i++){
      Link node;
      node=(Link)malloc(sizeof(Node));
      node->data=a[i];
      node->next=head->next;
      head->next=node;
  }
    return head;
}

2.尾插法(特点:与输入数据的顺序相同)

Link newList2(int a[], int n){
  Link head,rear;
  head=(Link)malloc(sizeof(Node));
  head->next=NULL;
  rear=head;
  for(int i=0;i<n;i++){
   Link node;
   node=(Link)malloc(sizeof(Node));
   node->data=a[i];
   node->next=NULL;//防止忘加在最后一位
   rear->next=node;
   rear=node;
  }
//node->next=NULL;
  return head;
}

3)单链表结点的删除 

思路:1.先判断是否为空表,若是空表提前返回false

2.工作指针p,q初始化,若q!=NULL,进入循环

3.若找到data==x;摘链,释放q指向内存,提前返回true

4.遍历没有找到x,返回false

bool deleteNode(Link head, int x){
  Link p,q;
  if(head==NULL;head->next==NULL)
  return false;
   p=head;
  q=head->next;
  while(q!=NULL){
    if(q->data==x){
     p->next=q->next;
     free(q);//释放要删除的内存
     return true
    }   
     else{
     p=q;
     q=q->next;//没找到移动指针
   }
  }
  return false;
}

4)单链表的释放(唯一移动头指针的类型)

思路:1.工作指针p初始化

2.如果head->next!=NULL,移动head

void clearLink(Link head){
   Link p;
  while(head->next!=NULL){//注意这里是next域
    p=head;
    head=head->next;
    free(p);
  }
}

二,循环链表 (能访问链表中某一结点前面的数据)

是将链表的最后一位的next域指向head,即将所有的node->next!=NULL换成node->next!=head

三, 双向链表

1)结点设置

typedef struct node {
	int data;          //数据域
	struct node *next; //指针域1,向后找
    struct node *prior;//指针域2,向前找
} Node, *Link;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想写好代码的小猫头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值