线性链表的是否带头结点问题

来源:互联网 发布:中国禁毒网络知识竞赛 编辑:程序博客网 时间:2024/05/23 15:46

简单线性链表的是否带头结点问题,花了点时间去整理了下。下面通过代码来解释下:

//链表带头结点与不带头结点的插入建立问题:       

两者区别:

    
1. 不带头结点的单链表对于第一个节点的操作与其他节点不一样,需要特殊处理,
     这增加了程序的复杂性和出现bug的机会,因此,通常
     在单链表的开始结点之前附设一个头结点。
2. 带头结点的单链表,初始时一定返回的是指向头结点的地址,所以一定要用二维指针,
    否则将导致内存访问失败或异常。  

3.带头结点与不带头结点初始化、插入、删除、输出操作都不样,在遍历输出链表数据时,
    带头结点的判断条件是while(head->next!=NULL),
    而不带头结点是while(head!=NULL),虽然头指针可以在初始时设定,但是如1所述,
   对于特殊情况如只有一个节点会出现问题。

/*不带头节点*/ #include<stdio.h>#include<stdlib.h> typedef struct node{    struct node *next;    int age;}Node; Node *CreatList(){     Node *head = NULL;      //头节点置空      Node *p,*t;               int a ;     while(scanf("%d",&a)){        if(a!=0){            t = (Node *)malloc(sizeof(Node));            t->age=a;            if(head==NULL){                head = t;                }            else{                p->next = t;            }                p = t;        }           else{                p->next=NULL;        //一定要有此部分结束,否则传值无底线             break;              //终止循环         }         }    return head;} void  print(Node *head){    Node *p = head;    while(p!=NULL){        printf("%d ",p->age);        p = p->next;    }} int main(){ Node *p; p = CreatList(); print(p);}/*带头节点*//*#include<stdio.h>#include<stdlib.h> typedef struct node{    struct node *next;    int age;}Node;Node *CreatList(Node *head){    head = (Node *)malloc(sizeof(struct node));   head->next = NULL;Node *p = head;int a;    while(scanf("%d",&a)){    if(a!=0){          Node *current = (Node *)malloc(sizeof(struct node));    current->age = a;p->next  = current;p = current;  //p作为当前节点,为后面输出做垫 }    else{    p->next = NULL;   break;      }  }    return head; }void print(Node *head){Node* p = head->next;    while(p){    printf("%d ",p->age);p = p->next;    }}int main(){Node *head,*p;p = CreatList(head);print(p);    return 0;}*/ 


 

原创粉丝点击