简单线性链表的是否带头结点问题,花了点时间去整理了下。下面通过代码来解释下:
//链表带头结点与不带头结点的插入建立问题:
两者区别:
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;
}*/