单链表
一、对于头指针和头结点的进一步理解:
1、链表中第一个结点的存储位置叫做头指针,整个链表的存取就必须从头指针开始进行。
2、有时链表的名字就是头指针,有时将链表封装成一个结构体里面包含头指针。
3、对于一个链表来说,头指针是必要的,而头结点是非必要的。
4、头结点的存在只是为了方便链表的统一操作而设置的,有了头结点后,对第一个元素之前插入结点和删除第一个结点的操作,与对其他结点的操作统一了。
图1:带有头结点的示意图
图2:不带头结点的示意图
二、代码(带有头结点)
#ifndef __LINKEDLIST_H
#define __LINKEDLIST_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 1
#define ERROR 0
typedef int states;
typedef int ElementType;
/** 链表结点以及表头结构 */
typedef struct node{
ElementType data; //数据域
struct node *next; //指针域
}Node,* LinkedList;
/** 链表初始化 */
states InitLinkedList(LinkedList *L);
/** 单链表的读取 */
states GetElem(LinkedList L,int pos,ElementType *x);
/** 单链表的插入操作 */
states InsertLinkedList(LinkedList L,int pos,ElementType x);
/** 单链表的删除操作 */
states DeleteLinkedList(LinkedList L,int pos,ElementType *x);
/** 创建单链表--头插法 */
void CreateLinkedList_H(LinkedList L);
/** 创建单链表---尾插法 */
void CreateLinkedList_T(LinkedList L);
/** 清空链表 */
states ClearLinkedList(LinkedList *L);
/** 获取链表结点个数 */
int GetLinkedListLength(LinkedList L);
/** 打印链表结点数据 */
void PrintfList(LinkedList L);
#endif /* __LINKEDLIST_H */