关于表头链表

来源:互联网 发布:如何判断咬肌肥大知乎 编辑:程序博客网 时间:2024/06/05 18:39

在链表的操作中由于头结点缺少“前驱节点”而导致很多对链表的操作必须分情况,但是如果头结点有“前驱节点”的话,问题的代码会变得更简单一点,表头结点的产生恰恰解决了这个问题,创建表头结点的代码如下:

<pre class="c" name="code">#include <stdio.h>#include <stdlib.h>typedef struct node{    int val;    struct node *next;}Node;//类型定义结构体Node *creatlistlink(int *a,int n){    Node *tail,*head,*new_node;    int i;    tail=head=(Node *)malloc(sizeof(Node));//创建表头节点    tail->next=NULL;    for(i=0;i<n;i++) //尾插创建链表    {        new_node=(Node *)malloc(sizeof(Node));//为新节点分配内存        new_node->next=NULL;        new_node->val=a[i];        tail=tail->next=new_node;//tail移动创建的节点上去    }    return head;}

 在表头节点创建好了之后,对链表的操作接变得很简单了,以删除链表中的元素为例来看一看表头结点带来的好处:

void Del_val(Node *h,int key)//带表头节点的删除算法{    Node *p,*delp=NULL;    for(p=h;p->next!=NULL;p=p->next){  //跑链表        if(p->next->val==key){ //找到待删节点            delp=p->next;  //delp指向待删节点            p->next=delp->next; //挂链            free(delp);//释放节点            break;        }    }


在无表头的链表中对链表中的节点排序如果头结点需要排序的话由于头结点没有前驱节点会使得头结点待排序的情况分开讨论,而带表头的链表就解决了这个问题。

 

0 0
原创粉丝点击