1.啥是单链表?->线性表的链式存储
单链表是由若干个节点(Node)构成的,每个节点由两个部分组成:数据域和指向下一个节点的指针域。其中,数据域存储节点所要保存的数据,指针域指向下一个节点的地址。单链表的首节点称为头节点,尾节点的指针域指向空(NULL)。整个链表是由多个节点按照一定的顺序连接在一起形成的数据结构。可以通过头节点访问整个链表,从头节点开始,按照指针域逐个遍历各个节点。
2.结构体定义
typedef int ElemType;//单个数据类型定义
//单链表的结构体定义
typedef struct node{
ElemType data;
struct node *next;
}NODE,*Linklist;
3.创建单链表方法1:初始化建立单链表
(1)初始化函数
Linklist Initlist(){
Linklist L;
L=(Linklist)malloc(sizeof(LNODE));
//可以直接写成Linklist L=(Linklist)malloc(sizeof(LNODE));
L->data=0;
L->next=NULL;
return L;
}
(2)主函数
int main(){
Linklist L;
L=Initlist();
printf("%d",L->data);
return 0;
}
4.头插法和尾插法建立单链表
(1)头插法建立单链表
//已有头节点L
bool head_insert(Linklist L){
Linklist s;
ElemType e;
scanf("%d",&e);
//输入负数结束
while(e>0){
s=(Linklist)malloc(sizeof(LNODE));
s->data=e;
s->next=L->next;//第1步
L->next=s;//第2步
L->data++;//存入一个数据data,计数1次
scanf("%d",&e);
}
return true;
}
(2)尾插法建立单链表
bool tailist(Linklist L){
Linklist *p,*q,*t;//t用来存数据,p为尾指针
ElemType e;
scanf("%d",&e);
while(e>0){
t=(Linklist)malloc(sizeof(LNODE));
t->data=e;
q=L;//q先指向头节点
p=q->next;//p指向当前末节点
//移动p找到末节点
while(p!=NULL){
//如果链表中有其他元素,也就是说L->next(p=q->next,q=L)不等于空
if(p->data<t){
q=p;//把q移动到p的位置
p=p->next;//p一直往后移动,直到p定位到末节点为止
}
else break;
}
//链表中没有任何元素
t->next=p;//1.t->next=L->next(p=L->next)
q->next=t;//2.把t插到末指针后面
scanf("%d",&t);
}
return true;
}