单链表的概念
定义:采用链式存储结构的线性表称为链表。
从实现角度可以分为:
静态链表、动态链表;
从链接方式可以分为:
单链表、双向链表、循环链表;
单链表:链表中的每一个结点只有一个指针域。
单链表包括两个域:
- 数据域:用来存储结点的数据值;
- 指针域:用来存储数据元素的直接后继的地址。
结点的定义:
typedef struct Node{
ElemType data;
struct Node *next;
}LNode,*LinkList;
基本操作
单链表建立
有时为了操作方便,在单链表的第一个结点之前附加一个结点,称为头结点。头结点的数据域可以存储标题、表长等信息,也可以不存储任何信息,其指针域存储第一个结点的首地址。
头指针变量定义:
LinkList H;p=(LinkList) malloc(sizeof(LNode));
表示申请一块LNode类型的存储单元的操作,并将其地址赋值给变量p;
free( p) 表示释放指针p所指向的结点空间。
1. 头插法建表
在链表的头部插入结点建立单链表,首先申请一个头结点,并且将头结点指针域置空(NULL);然后每读入一个数据元素则申请一个结点,并插在链表的头结点之后。
算法:时间复杂度为O(n)
LinkList CreateFromHead(){
LinkList L;
LNode *s;
int x;
int flag=1;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
scanf("%d",&x