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

本文探讨了单链表是否使用头结点的问题,并通过具体代码实例对比了两种方式在初始化、插入、删除和输出操作上的不同。指出使用头结点能简化编程流程并减少错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

两者区别:

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


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值