1,不带头结点的单链表操作中,除了InitList(),GetElem(),ListInsert(),ListDelete()操作与带头结点的单链表有差别外,其它的操作基本上一样。
2,不带头结点单链表示意图:
链表指针直接指向了首元节点,因此在首元节点前插入数据元素或者删除首元节点元素都会改变头指针的值。
3,不带头结点的单链表定义及操作集合,除了插入,删除,清空操作需要传递头指针的地址外,基本上一样。头文件defs.h
1 #ifndef _DEFS_H_ 2 #define _DEFS_H_ 3 4 #include<stdio.h> 5 #include<malloc.h> //malloc(),free() 6 #include<stdlib.h> //exit() 7 8 struct LNode 9 { 10 int data; 11 int * next; 12 }; 13 typedef struct LNode * linklist; 14 15 //操作集合,注意ClearList,ListInsert,ListDelete 16 void InitList(linklist *L); 17 void DestroyList(linklist *L); 18 void ClearList(linklist *L); //这里,清空和撤销一样 19 void ListEmpty(linklist L); 20 int ListLength(linklist L); 21 int GetElem(linklist L, int i, int *e); 22 int LocateElem(linklist L, int e); 23 int PriorElem(linklist L, int cur_e, int *pri_e); 24 int NextElem(linklist L, int cur_e, int *nex_e); 25 int ListInsert(linklist *L, int i, int e); //注意在首元结点前插入时改变头指针 26 int ListDelete(linklist *L, int i, int *e); //删除首元结点时改变头指针 27 void TravelList(linklist L); 28 #endif //只要是能够改变头指针的值,均是传递头指针的地址
4,InitList操作。其不需要分配结点,直接令头指针为空
1 #include"defs.h" 2 3 void InitList(linklist *L) 4 { 5 (*L) = NULL; //*L即表示头指针 6 }