带头结点与不带头结点的单链表初始化
2010-02-02 00:00
1151 查看
带头结点初始化
Node *head; //声明头结点 void InitList(Node **head){ *head=(Node *)malloc( sizeof(Node)); (*head)->next=NULL; }
带头结点尾插入,统一操作。
方式一:
void CreatList(Node **head){ Node *r=*head,*s; int a; while(scanf("%d",&a)){ if(a!=0){ s=(Node *)malloc(sizeof(Node)); s->value=a; r->next=s; r=s; } else{ r->next=NULL; break; } } }
调用CreatList(&head);
方式二:
void CreatList(Node *head){ Node *r=head,*s; ... //下面的都一样 }
调用CreatList(head);
不带头结点初始化
方式一:void InitList(Node **head){ *head=NULL; }
调用InitList(&head);
方式二:
void InitList(Node *head){ head=NULL; }
调用InitList(head);
不带头结点尾插入,第一个节点与其他节点分开操作。
void CreatList(Node **head){ Node *p,*t; /*p工作指针,t临时指针*/ int a,i=1; while(scanf("%d",&a)){ if(a!=0){ t=(Node *)malloc(sizeof(Node)); t->value=a; if(i==1){ *head=t; } else{ p->next=t; } p=t; } else{ p->next=NULL; break; } i++; } }
调用CreatList(&head);
两种初始化方法的区别
不带头结点的单链表对于第一个节点的操作与其他节点不一样,需要特殊处理,这增加了程序的复杂性和出现bug的机会,因此,通常在单链表的开始结点之前附设一个头结点。带头结点的单链表,初始时一定返回的是指向头结点的地址,所以一定要用二维指针,否则将导致内存访问失败或异常。
带头结点与不带头结点初始化、插入、删除、输出操作都不样,在遍历输出链表数据时,带头结点的判断条件是while(head->next!=NULL),而不带头结点是while(head!=NULL),虽然头指针可以在初始时设定,但是如1所述,对于特殊情况如只有一个节点会出现问题。
为什么不带头结点初始化有2种方式,而带头结点只有1种方式呢?
因为不带头结点声明Node *head 时,C编译器将其自动初始化为NULL,于是根本不需要调用InitList(head); 也即不带头结点的初始化是个伪操作。而带头结点的初始化在堆开辟了一段内存,需要修改head指针变量指向的地址(即head的值),所以要修改head的值,必须传保存head变量的地址(即二维指针)。而直接调用CreatList(head);相当于传head变量的值,函数修改的是head的副本,无法真正改变head的值。注:这里可以将head指针看成一个变量(不管它保存的是地址),就比较好理解了。
这其实本质上还是传值,传址的问题,只不过指针本身保存的地址,让这个过程变得有点纠结。在函数调用需要修改指针变量的指向(value)时,应该传递指针变量的地址(address)。
另外,对于函数的形参是指针时,只要该参数不在左边(即都是右值操作),二维指针(形参)就可以简化为一维指针。如上面带头结点的尾插简化版本。
相关文章推荐
- 带头结点的链表初始化 和不带头结点的链表初始化
- 带头结点的循环链表表示队列的初始化、入队列和出队列的算法
- 假设以带头结点的循环链表表示队列, 并且只设一个指针指向队尾元素结点(注意不设头指针) 试编写相应的队列初始化,入队列和出队列的算法
- 带头结点的单链表上将后k个结点变换为前k个结点的操作
- 自己实现集合框架(七):带头结点单链表的实现
- 设计一个递归算法,删除不带头结点的单链表中所有值为x的结点
- C语言实现单链表节点的删除(带头结点)
- 带头结点与不带头结点的单链表-LinkList
- 带头结点的单链表就地逆置
- 带头结点头部插入创建链表
- 删除链表中(不带头结点)值为value的结点,返回删除的个数
- 数据结构_不带头结点的链表逆制
- 基于链表:逆置带头结点的单链表
- 对带头结点的单链表的简单操作
- 求不带头结点的单链表的节点的个数
- 带头结点的链表去重
- 带头结点的双向循环链表
- 数据结构模版----单链表SimpleLinkList[不带头结点&&伪OO](C语言实现)
- 将带头结点的单链表利用原结点空间将其逆置
- 不带头结点的单链表