1)单链表的定义
typedef struct Lnode
{
int data;
Lnode *next;
}*Linklist;
注意c++中结构体定义与c的区别,以上*Linklist为struct Lnode的别名
要使用结构体需要先定义对象 Linklist s1; s1->data=5;
上述定义若写成
typedef struct
{
int data;
Lnode *next;
}Lnode;
则Lnode就是结构体的对象,可直接使用 Lnode.data=5。
另外c中结构体指针next前需加struct ,c++不需要
2)单链表初始化
正确写法一:
void initial_list(linklist &L)
{
L=new lnode;
L->next=NULL;
}
调用
linklist s1;
initial_list(s1);
<pre name="code" class="cpp">正确写法二:
void initial_list(linklist *L) {*L=new lnode;(*L)->next=NULL;}调用 linklist s1;initial_list(&s1);
错误写法:
void initial_list(linklist L)
{
L=new lnode;
L->next=NULL;
}
调用
linklist s1;
initial_list(s1);
L申请内存后本身会发生变化,需要用指针或者引用传递,错误写法中指针为传值调用,初始化出错。
3)单链表头插法插入节点
void insert_head(Linklist L,int x) //头插法插入节点,每个节点都插在头结点后面,x为插入数据
{ //因为插入前后头指针L无变化,所以直接传值
Linklist s=new Lnode;
s->data=x;
s->next=L->next;
L->next=s;
}
注意区分头指针,头结点,首元结点
L为头指针,本质为指针,本身并没有申请节点空间
L->data为头结点的数据域,一般里面没有有效值
L->next为头结点指针域,存放的地址为下一个节点即首元结点的地址
4)单链表尾插法插入节点
void insert_tail(Linklist L,int x)
{
Linklist s=new Lnode;
Linklist tail=L;
while(tail->next)
tail=tail->next;
s->data=x;
s->next=NULL;
tail->next=s;
}
5)向有序单链表中的合适位置插入节点
void insert(Linklist L,int i)
{
Linklist p=L; //p为待插入位置的前驱结点
Linklist s=new Lnode;
while(p->next && i>p->next->data ) //寻找p的正确位置,p->next为NULL时即p来到最后一个节点,在p后插入
{
p=p->next;
}
s->next=p->next;
p->next=s;
s->data=i;
}