链表初始化总结
顺序表:
声明:struct seqlist
{
Int last;
Int data[12];
}seq,*seqlist;
初始化
seqlist init_seqlist()
{
seqlist sl = malloc(sizeof(seq));
sl->last =-1;//标记位,用于判断是表头还是表尾
return sl;
}
插入操作(判断是否满,定位,移位(从后开始移),插入);
删除操作(判断是否为空,定位,移位,从定位的位置开始移);
------------------------
单链表:
声明:typedef struct node
{
lnt data;
struct node *next;
}listnode,*linklist;
初始化:
- 不带表头:
linklist init_list()
{
linklist L = NULL;
return L;
}
- 带表头(较常用)
linklist init_list()
{
linklist L =malloc(sizeof(listnode));
L->next =NULL;
return L;
}
插入操作(产生一个新节点,定位,插入新节点)
删除操作(判断是否为空,定位,删除节点)
反转操作:
linklist p,q;
p=L->next;
L->next = NULL;//将链表断开
while(p!=NULL)
{
q = p->next;
p->next = L->next;
L->next = p;不断在L的后面循环插入p及p的下个节点
p = q;
}
----------------------------------------
单向循环链表:
声明:typedef struct node
{
int data;
struct node *next;
}listnode,*linklist;
初始化:
- 不带头
linklist init_list()
{
linklist L =NULL;
return L;
}
- 带头节点
linklist init_list()
{
linklist L =malloc(sizeof(listnode));
L->next = L;
return L;
}
不带头,插入操作(产生新节点,判断是否为空,如果为空*l = new,new->next=new,否则插入节点)注意因为有对l操作,所以注意取地址。Linklist l 是个变量而不是指针,只有*l才是指针。
删除操作(类似于单链表);
-------------------------------
双向循环链表:
声明:
typedef struct node()
{
int data;
struct node *next,*prve;
}linknode,*linklist;
初始化:
linklist init_list()
{
linklist L = malloc(sizeof(listnode));
L->next = L;
L->prve = L;
return L
}
插入操作:(产生新节点,定位,插入)
尾部插入,中间插入只需将L改成p;
new->n=L;
new->p = L->p;
L->p->n = new;
L->p=new;
删除操作:
p0->p->n = p0->n;
p0->n->p = p0->p;
p0->n = p0->p = NULL;
奇偶排序:将以上两个结合。注意记录q=p->prev;方便节点向前移;
内核链表:类型无关的双向循环链表。(内核链表节点包含在宿主节点中):