數據結構作業(第二章 線性表,鏈表)

由於本蒟蒻水平有限,對於出現的錯誤請各位大佬聯繫我糾正,謝謝!

另外不要原封不動的照抄,讓我被Ban以後就不更了,哼哼!

還有這本數據結構明明寫的是c語言,卻用&不用*,&是C++的引用,請大家自行查閱。

1. 順序表 a 中的數據元素遞增有序。試寫一算法,將 x 插入到順序表的適當位置上,以保持該表的有序性。
  
void InsertOrderList( SqList &a, ElemType x)
  // 已知順序表 a 中的數據元素遞增有序,將 x 插入到順序表的適當位置上,
  
// 以保持該表的有序性。

void InsertOrderList( SqList &a, ElemType x)
{
	if(a.length>a.=a.listsize)
	{
		newbase=(ElemType*)realloc(a.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
		if(!newbase) exit(OVERFLOW);
		a.elem=newbase;
		a.listsize+=LISTINCREMENT;
	}
	int i;
	for(i=0;i<a.length;i++)
		if(p<=a.elem[i])
			 break;
	for(int j=a.length;j>i;j++)
		a.elem[j]=a.elem[j-1];
	a.length++;
}

3. 已知線性表中的元素以值遞增有序排列,並以單鏈表作存儲結構。試寫一高效的算法,刪除表中所有值大於 mink 且小於 maxk 的元素 (若表中存在這樣的元素)同時釋放被刪結點空間。(注意:mink maxk 是給定的兩個參數值,它們的值可以和表中的元素相同,也可以不同)
  
void del_between_mink_and_maxk( LinkList& hlink, ElemType mink, ElemType maxk )
// hlink 爲指向單鏈表頭結點的指針,刪除鏈表中其值介於 mink maxk 之間的結點。

void del_between_mink_and_maxk( LinkList& hlink, ElemType mink, ElemType maxk )
{
	LinkList p=hlink;
	LinkList q=hlink->next;
	Linklist u;
	while(q)
	{
		if(q->data>mink&&q->data<maxk)
		{
			p->next=q->next;
			u=q;
			q=q->next;
			free(u);
		}
		else
		{
			p=p->next;
			q=q->next;
		}
	}
}

4. 試寫一算法,實現順序表的就地逆置,即利用原表的存儲空間將線性表( , , ) 逆置爲( , ,, )
  
void invert_sqlist(SqList& va)
  // 逆轉順序表 va

void invert_sqlist(SqList& va)
{
	for(int i=0;va.length-1-i>=i;i++)
	{
		ElemType p;
		p=va.elem[i];
		va.elem[i]=va.elem[va.length-1-i];
		va.elem[va.length-1-i]=p;
	}
}

5. 試寫一算法,對單鏈表實現就地逆置。
  
void invert_linkst(LinkList &hlink)
  // 逆轉以 hlink 爲頭指針的單鏈表

void invert_linkst(LinkList &hlink)
{
	LinkList p=hlink->next;
	LinkList q=invert(p->next,hlink);
	q->next=p;
	p->next=NULL;               
}
LinkList invert(LinkList &p,LinkList &hlink)
{
	if(p->next==NULL)
		hlink->next=p;
	else
	{
		LinkList q=invert(p->next,hlink);
		q->next=p;
	}
	return p;
}

7. 假設以兩個元素依值遞增有序排列的順序表 A B 分別表示兩個非純集合(即同一表中可能存在值相同的元素),現要求構成一個線性表 C,其元素爲 A B 中元素的交集,且表 C 中的元素也依值遞增有序排列並各不相同,並要求 C 表和 A 表共享存儲空間。
  
void intersect_sqlist( SqList& va, SqList vb )
  // va vb 均爲有序(值自小而大)順序表,且同一表中可能有值相同的
  
// 數據元素,本函數實現從 va 中刪除所有值和 vb 中元素不相同的元素,
  
// 並使最後所得的順序表 va 中的數據元素值均各不相同。 

void intersect_sqlist( SqList& va, SqList vb)
{
	int pos=1;
	for(int i=1;i<va.length;i++)
		if(va.elem[i]!=va.elem[i-1])
			va.elem[pos++]=va.elem[i];
	va.length=pos;
	pos=0;
	for(int i=0;i<va.length;i++)
		for(int j=0;j<vb.length;j++)
			if(vb.elem[j]==va.elem[i])
			{
				va.elem[pos++]=va.elem[i];
				break;
			}
	va.length=pos;
	va.elem=(ElemType*)realloc(sizeof(ElemType)*va.length);
	a.listsize=sizeof(ElemType)*va.length;
}

11. 設有一個雙向循環鏈表,每個結點中除有 predata next 三個域外,還增設了一個訪問頻度域 freq。在鏈表被起用之前,頻度域 freq 的值均初始化爲零,而每當對鏈表進行一次 LOCATE(L,x) 的操作後,被訪問的結點(即元素值等於 x 的結點)中的頻度域 freq 的值便增 1,同時調整鏈表中結點之間的次序,使其按訪問頻度非遞增的次序順序排列,以便始終保持被頻繁訪問的結點總是靠近表頭結點。試編寫符合上述要求的 LOCATE 操作的算法。
  
DuLink visit( DuLinkList dh, ElemType x )
  // 本題要求返回指向被訪問的結點的指針,若鏈表中不存在和 x 相等的元素,
  
// 這返回 NULLdh 是指向雙向循環鏈表頭結點的指針,結點中還增設了一個
  
// 訪問頻度域 freq,其初值爲 0,一旦結點被訪問,其訪問頻度域的值增 1
  
// 並始終保持鏈表中的結點按 freq 的值非遞增排列

DuLink visit( DuLinkList dh, ElemType x )
{
	DuLinkList p=dh->next;
	DuLinkList q=NULL;
	while(p->next!=dh)
	{
		if(p->data==x}
		{
			q=p;
			p->freq++;
			p->pre->next=p->next;
			p->next->pre=p->pre;
			break;
		}
		p=p->next;
	}
	if(q!=NULL)
	{
		p=dh->next;
		while(p->next!=dh&&p->frep>=q->frep)
			p=p->next;
		q->pre=p->pre;
		q->next=p;
		p->pre->next=q;
		p->pre=q;
	}
	return q; 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章