链表
有了顺序表为什么还要有链表呢?下面说说他们的异同把
链式存储:使用不连续的存储单元进行存储。
顺序存储:使用连续的存储单元进行存储。
假设,我们的内存空间只剩下1个G了,要存储一个G的数据,用顺序表的话就必须让系统给分配连续的1个G单元,要是没有就不能存储了,而链表就不需要.这就是优点所在.
链表结构如下:
数据域 指针域
Data
Next
数据域:用来存储本节点的数据。
指针域:用来存储下一个节点的地址。(指针指向下一个节点)
下面开始创建链表:
① 创建一个结构体,给他重命名为ElemSN。
typedef struct node{
int data;//数据域
struct node * next;//指针域
}ElemSN;//重命名为ElemSN
typedef 这个函数的作用就是重命名。
②给节点分配单元(动态单元)
分配动态单元要用到malloc函数,不懂得自己回去复习一下哦。
设类型名为ElemSN *;
ElemSN *p;
(ElemSN*)malloc(sizeof (ElemSN));
引用成员要用:
p->data;(数据域)
p->next;(指针域)
下面介绍一些术语:
前驱节点:链表中相邻的两个节点,前面的那一个。
后继节点:链表中相邻的两个节点,后面的那一个。
****前驱节点的指针域存放着后继节点的地址(说白了就是指向后继节点)
头结点:第一个节点,单向链表中没有前驱节点的节点、
尾节点:最后一个节点,单向链表中没有后继节点的节点。
单向链表的特点:
㈠ 有且只有一个节点没有前驱——头结点
㈡ 有且只有一个节点没有后继——尾节点
㈢ 除了头尾节点之外,其余节点有且只有一个前驱,一个后继。
创建及输出链表:
假设数据集合为a={1,2,3,4,5,6}
#include<stdio.h>
#include<stdlib.h>
#define N 5
typedef struct node{
int data;
struct node *next;
}ElemSN;
ElemSN *createlink1(int a[])
{
ElemSN *h=NULL,*tail,*p;
for(int i=0;i<N;i++)
{
p=(ElemSN*)malloc(sizeof(ElemSN));//分配一个动态单元给p
p->data=a[i];//数据域赋值
p->next=NULL;//指针域赋空
if(!h)
h=tail=p;//判断是不是第一个结点,是,头尾都指上来
else
tail=tail->next=p; //不是,挂链,挪尾指针。
}
return h;//返回头指针h
}
void*printlink(ElemSN*h)
{
ElemSN*p;
for(p=h;p;p=p->next)
printf("%5d",p->data);
}
int main (void)
{
int a[N]={1,2,3,4,5};
ElemSN *head=NULL;
//正向创建链表
head=createlink1(a);//用head接收头指针
//输出链表
printlink(head);
return 0;
}
谢谢大家我是小纸人。