头结点
线性链表的结点类型定义1
2
3
4typedef struct Lnode{
ElemType data;
Struct Lnode *next;
}Lnode *linklist;
说明:LNode
:结构类型名;LNode
:类型结构变量有两个域:data
:存放线性表的数据元素,next
:存放元素直接后继结点的地址;
该类型结构变量用于表示线性链表中的一个结点;LNODE *p;
:p为指向结点(结构)的指针变量;
p是LNODE类型的指针变量
建表
头插法建立单链表L1
2
3
4
5
6
7
8
9
10
11
12
13
14
15Linklist CreateFromHead(){
L = (Linklist)malloc(sizeof(LNode));
L->next = NULL;
while(flag){
c = getchar();
if(c!='$'){
s = (LNode*)malloc(sizeof(LNode));
s->data = c;
s->next = L->next;
L->next = s;
}else
flag = 0;
}
return L;
}
插入
插入的主要内容如下:1
2
3
4q=(LNode*)malloc(sizeof(LNode));
q->data = 'a';
q->next = p->next;
p->next = q;
删除
1 | q = p->next; |
插入、删除算法中的循环条件为何不同?
删除算法中的循环条件(p->next! =NULL && k<i-1
)与前面插入算法中的循环条件(p! =NULL && k<i-1
)不同,因为前面插入算法时的插入位置有m+1
个(m为当前单链表中数据元素的个数)。i=m+1
是指在第m+1
个位置前插入,即在单链表的末尾插入。而删除操作中删除的合法位只有m个,若使用与前面插入操作相同的循环条件,则会出现指针指空的情况, 使删除操作失败。
循环链表的定义
将线性链表的最后一个结点的指针指向链表的第一个结点(是一个首尾相连的单链表)
循环链表与线性链表操作的主要差别?
循环链表与线性链表操作的主要差别是算法中循环结束的条件不是p或p->next是否为NULL,而是它们是否等于头指针;
双向链表的定义
双向链表中,每个结点有两个指针域,一个指向直接后继元素结点,另一个指向直接前趋元素结点。1
2
3
4typedef struct DNode{
ElemType data;
struct DNode *prior,*next;
}DNode,*DoubleList;