单链表

来源:互联网 发布:js delete 编辑:程序博客网 时间:2024/06/05 15:02

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;}


0 0