取结点个数
取结点个数时,cnt从0开始
//求单链表的表长
//从首元结点开始,依次计数所有结点
int ListLength_L(Linklist L) {
int cnt = 0;
LNode* p;
p = L->next;
while (p != NULL) {
cnt++;
p = p->next;
}
return cnt;
}
//取值,取单链表中第i个元素的内容
取第i个元素的内容时,cnt从1开始
因为p的初值时L->next,如果p不为NULL时,那么p指向首元结点
如果i的值为1,并且cnt初值取0的话,那么while循环会执行依次,此时p会指向首元结点后面一个结点,此时p->data的值不对
Status GetElem_L(Linklist L, int i, ElemType& e) {
LNode* p;
int cnt = 1;
p = L->next;
while (p != NULL && cnt < i) {
p = p->next;
cnt++;
}
if (p == NULL || cnt > i)
return ERROR;
e = p->data;
return OK;
}
按值查找,根据指定数据获取该数据的位置序号
cnt取0,理由同上
int LocateElem(Linklist L, ElemType e) {
LNode* p;
int cnt = 1;
p = L->next;
while (p != NULL && p->data != e) {
cnt++;
p = p->next;
}
if (p == NULL)
return 0;
return cnt;
}
//删除第i个结点
因为要删除第i个结点,所以第i个结点必须要有内容
让p指向第i-1个结点,那么p->next就是第i个结点,所以判断条件要有p->next != NULL
Status DeleteList(Linklist& L, int i, ElemType& e) {
LNode* p;
p = L;
int cnt = 1;
while (p->next != NULL && cnt < i - 1) {
p = p->next;
cnt++;
}
if (p->next == NULL || cnt > i - 1)
return ERROR;
LNode* q = p->next;
e = q->data;
p->next = q->next;
delete q;
return OK;
}
//建立单链表(尾插法),元素插在链表尾部
void CreatList_T(Linklist& L, int n) {
L = new LNode;
L->next = NULL;
LNode* r = L;
for (int i = 0; i < n; i++) {
LNode* p;
p = new LNode;
scanf(&p->data);
r->next = p;
p->next = NULL;
r = p;
}
}