带头结点的单链表:
单链表由表头唯一确定,若头指针名为L,则链表L。
单链表的存储结构:
类型:数据域data是随数据元素决定的;指针域类型是指针型。
int p; p = &a;
用自己定义自己,指针的类型,指向的变量的类型依然是递归的那个类型(也就是定义的那个结构类型)
Lnode, *LinkList(表示LinkList的类型是指针型);(LinkList为指向结构体Lnode的指针类型)
定义链表L:LinkList L;
定义结点指针p:LNode p;
举例:学号、姓名、成绩(三个数据域,)
typedef Struct student{ char num[8]; che name[8]; int score; struct student *next; }Lnode, *LinkList;
然后:LinkLIst L; 再让L指向头结点就可以了
单链表的初始化:
构建一个空表:(1)生成新结点作为头结点,用头指针L指向头结点;(2)将头结点的指针域置空。
Status InitList L(LinkList &L) {
L = new LNode; // 从内存中找到空间给L
L->next=NULL;
return OK;
}
判断链表是否为空:
判断头结点指针域是否为空
int ListEmpty(LinkList L){ if(L->next) return 0; else return 1; }
单链表的销毁:
从头指针开始,依次释放所有结点
p = L;
★ L=L->next; // 下一结点的地址赋给L
delete p; // 删除地址,它对应的是new
什么时候结束:L被赋给最后一个,即为空时,循环就停止(结束条件:L==NULL、循环条件:L!=NULL或L)
Status DestoryList_L(LinkList &L){ Lnode *p; // 或者LinkList p; while(L) { p = L; L = L ->next; delete p; } return OK; }
清空单链表:(链表仍然存在,但链表中无元素,成为空链表)
依次释放所有结点,并将头结点指针域设置为空
(如果从头结点开始,那么就p = L; 如果从首元结点开始,那么就p = L->next)
Status ClearList(LinkList &L) { Lnode *p, *q; // 或者LinkList p, q; p = L->next; while(p) { q = p->next; delete p; p = q; } L->next = NULL; return OK; }
求链表的表长
从首元结点开始,依次计数所有结点
int ListLength_L(LinkList L){ Lnode *p; // 或者LinkList p; p = L->next; i = 0; while(p) { i++; p = p->next; } return i; }(LinkList L) L前面加不加&,取决于L有没有变化,需要用L带回操作后的结果,就加&
带头结点的单链表:
P = L; // p指向头结点 s = L->next; // s指向首元结点 p = p->next; // p指向下一个结点