資料結構(線性錶鏈式儲存)的幾個基本操作

Torch_Ch發表於2020-12-05

取結點個數

取結點個數時,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;
	}
}

相關文章