1,链表的储存方式:
链式储存(存储单元不连续)
而顺序存储以连续的储存单元进行存储。
链式存储不可计算存储单元的地址,只可以存储的形式记录某一节点的地址
2,结点的结构:(结构体类型)
数据域 | 指针域 |
---|---|
data | next |
struct node{
int data;
struct node *next; //next指向struct node 类型的单元
};
**关于typedef:类型重命名 用法: typedef 类型 重命名;
struct node{
int data;
struct node *next;
};typedef struct node ElemSN;
typedef struct node{
int data;
struct node *next;
}ElemSN;
3,结点单元的分配:
ElemSN p;p=(ElemSN)malloc(sizeof(ElemSN));
引用成员:p->data; p->next;
4,链表的术语及特点:
术语:
前驱结点及后继结点:
链表中相邻的两结点,前驱结点的指针域存放后继结点的地址,或者说,前驱结点指针域指向后继结点。
终端结点:
头结点(单向链表中没有前驱结点的结点)
尾结点(单向链表中没有后继结点的结点)
线性链表的特点:
(1)有且只有一个结点无前驱结点(头结点)
(2)有且只有一个结点无后继结点(尾结点)
(3)除头尾结点以外其余结点有且只有一个前驱有且只有一个后继
5,创建单向链表:
最初建链方法:
ElemSN *CreateLink(int a[])
{
ElemSN *p,*h,*tail; //创建头结点
h=tail=(ElemSN*)malloc(sizeof(ElemSN));
h->data=a[0];
h->next=NULL;
for(int i=1;i<N;++i)
{
p=(ElemSN*)malloc(sizeof(ElemSN));
p->data=a[i];
p->next=NULL;
tail->next=p;
tail=p;
}
return h;
}
因为头节点要单独返回,所以先创建创建头节点,尾节点与中间节点用for循环创建
ElemSN *CreateLink(int a[])
{
ElemSN *p,*h=NULL,*tail;
for(int i=0;i<N;++i)
{
p=(ElemSN*)malloc(sizeof(ElemSN));
p->data=a[i];
p->next=NULL;
if(!h)
tail=h=p;
else
tail=tail->next=p;
}
return h;
}
改进了头节点需要单独创建的缺点
ElemSN *CreateLink(int a[])
{
ElemSN *h=NULL,*tail;
tail=h=(ElemSN*)malloc(sizeof(ElemSN));
h->data=a[0];
h->next=NULL;
for(int i=1;i<N;++i)
{
tail=tail->next=(ElemSN*)malloc(sizeof(ElemSN));
tail->data=a[i];
tail->next=NULL;
}
return h;
}
去掉了指针p