带头结点的链表和不带头结点的链表主要不同点在插入和删除操作上。同时要注意,带头结点的链表初始化操作时建立头结点。
下面我们来看一下代码中的异同:
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
typedef int elemType;
typedef struct Node{//定义链接节点
elemType element;
Node* next;
}Node;
int insertLast(Node** pNode, elemType ele);
//1、初始化链表,未带头结点
void init(Node** pNode){
*pNode = NULL;
printf("------>链表初始化<------\n");
}
void init_n(Node** pNode){
*pNode = (Node*)malloc(sizeof(Node));//产生头结点,并使pNode头指针指向头结点
if (!(*pNode)){
printf("头结点初始化空间失败\n");
}
printf("------>链表初始化<------\n");
(*pNode)->next = NULL;
}
//1、创建链表
Node* create(Node* pHead){
Node* p1;//代表新节点
Node * p2;//代表尾节点
p1 = p2 = (Node*)malloc(sizeof(Node));//申请节点
if (p1 == NULL || p2 == NULL){
printf("内存空间申请失败\n");
exit(0);
}
memset(p1, 0, sizeof(Node));
printf("输入节点值(非正数结束):");