數據結構(嚴蔚敏版)習題集第二章課後標新號習題答案

#include
#include<stdio.h>
#include<cmath>
#include<string.h>
using namespace std;
/****預定義****/
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
/****類型定義****/
typedef int ElemType;
typedef int Status;
typedef int * Position;
typedef struct{
ElemType *elem;
int length;
int listsize;
}Sqlist;
struct LNode;
typedef struct Node * PtrToNode;
typedef struct LNode * PToNNode;
typedef PtrToNode List;
typedef PtrToNode Location;
typedef PToNNode ListL;
typedef struct Node {//單鏈表
ElemType Date;
Location Next;
};
typedef struct LNode {//雙向鏈表結點
ElemType Date;
ListL Next;
ListL prior;
ElemType freq;
};
typedef struct {
int coef;
int exp;
}PolyTerm;
typedef struct {
PolyTerm *data;
int length;
} SqPoly;
typedef struct PolyNode * Polyposition;
typedef struct PolyNode * PolyNode_L;
typedef struct PolyNode {
PolyTerm data;
Polyposition Next;
}PolyNode;
/****構建一個一元多項式的鏈表L****/
void CreatePolyn_L(PolyNode_L &L)
{
int num=0, coef=0, exp=0;
const char * order[7] = { "First", "Second", "Third", "Fourth", "Fifth", "Sixth", "Seventh" };
cout << "Please cin the num of the Poly: "; cin >> num;
PolyNode_L tmp,position;
L = (PolyNode_L)malloc(sizeof(PolyNode)); L->Next = NULL; position = L;
for (int i = 0; i < num; i++)
{
tmp = (PolyNode_L)malloc(sizeof(PolyNode));
cout << "The " << order[i] << " coef: "; cin >> coef;
cout << "and exp: "; cin >> exp;
tmp->data.coef = coef; tmp->data.exp = exp;
L->Next = tmp; L = L->Next;
}
L->Next = NULL;
L = position;
}
/****展示一個一元多項式的鏈表L****/
void Show_SqPolyn(const PolyNode_L &L)
{
PolyNode_L position; position = L;
position = position->Next;
cout << "The Sqpoly is: ";
while (position->Next != NULL)
{
cout << position->data.coef << "x^" << position->data.exp;
cout << "+";
position = position->Next;
}
cout << position->data.coef<<endl;
}
/****構建一個一元多項式的線性表L****/
Status CreatePolyn(SqPoly &L,ElemType n)
{
L.data = (PolyTerm*)malloc(n*sizeof(PolyTerm));
if (!L.data) exit(OVERFLOW);
L.length = 0;
return OK;
}
/****對一元多項式的線性表進行初始化****/
void Init_Polyn(SqPoly &L)
{
int num,coef,exp;
const char * order[7]={"First", "Second", "Third", "Fourth", "Fifth", "Sixth", "Seventh" };
cout << "Please cin the num of the Poly: "; cin >> num;
CreatePolyn(L, num);
for (int i = 0; i < num; i++)
{
cout << "The " << order[i] << " coef: "; cin >> coef;
cout << "and data: ";cin >> exp;
L.data[i].coef = coef; L.data[i].exp = exp;
L.length++;
}
}
/****構建一個空的線性表L****/
Status InitList_Sq(Sqlist &L)
{
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (!L.elem) exit(OVERFLOW);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}
/****展示線性表中的內容****/
void Show_Sq(const Sqlist &L)
{
for (int i = 0; i < L.length; i++)
{
cout << L.elem[i] <<" ";
}
}
/****展示單鏈表中的內容****/
void Show_List(List &L,int n)
{
Location P=L;
for (int i = 0; i < n; i++)
{
P = P->Next;
cout << P->Date << endl;
}
}
void Show_List(List &L)
{
Location P = L;
while(P->Next!=NULL)
{
P = P->Next;
cout << P->Date << endl;
}
}
/****展示雙向鏈表中的內容****/
void Show_LList(ListL &L)
{
ListL P = L,original=L;
while (P->Next != original)
{
P = P->Next;
cout << P->Date << endl;
}
}
/*********刪除單鏈表********/
void DeleteList(List &L) //使用說明:傳入的要求是頭結點
{
Location p,tmp;
p = L->Next;
L->Next = NULL;
while(p->Next!=NULL)
{
tmp = p->Next;
free(p);
p = tmp;
}
}
/******線性表刪除特定位置元素的值******/
Status Delete_Sq(Sqlist &L, int num)//num爲鏈表元素中的第num個
{
if ((num < 1) || (num > L.length))return ERROR;
for (int i = num-1; i < L.length-1; i++)
{
L.elem[i] = L.elem[i + 1];
}
L.length--;
return OK;
}
/*********線性表初始化**********/
void Sq_init(Sqlist &L,int n=0)
{
int num[10] = { 0 };
int num1[10] ={ 2, 2, 8, 12,13, 14, 17, 18, 20, 22 };
int num2[10] = { 2, 2, 2, 5, 10, 15, 16, 18, 20, 30 };
int num3[10] = { 2,4,6,8,10,12,14,16,18,20 };
if (n == 1)
{
for (int i = 0; i < 10; i++)
{
num[i] = num1[i];
}
}
if (n == 2)
{
for (int i = 0; i < 10; i++)
{
num[i] = num2[i];
}
}
if (n == 3)
{
for (int i = 0; i < 10; i++)
{
num[i] = num3[i];
}
}
for (int i = 0; i < 10; i++)
{
L.elem[i] = num[i];
L.length++;
}
}
/**********單鏈表初始化******/
void L_init(List &L,int n=1)
{
int num[10] ={ 2,2,3,4,5,6,7,8,9,10 };
int num1[10] = { 2, 2, 8, 12,13, 14, 17, 18, 20, 22 };
int num2[10] = { 2, 2, 2, 5, 10, 15, 16, 18, 20, 30 };
int num3[10] = { 2,4,6,8,10,12,14,16,18,20 };
if (n == 1)
{
for (int i = 0; i < 10; i++)
{
num[i] = num1[i];
}
}
if (n == 2)
{
for (int i = 0; i < 10; i++)
{
num[i] = num2[i];
}
}
if (n == 3)
{
for (int i = 0; i < 10; i++)
{
num[i] = num3[i];
}
}
Location tmp, original;
L = (PtrToNode)malloc(sizeof(Node));//創建頭結點;
original = L;
L->Next = NULL;
for (int i = 0; i < 10; i++)
{
tmp = (PtrToNode)malloc(sizeof(struct Node));
tmp->Date = num[i];
//if (i == 0) { L->Next = tmp; p = tmp; tmp->Next = NULL; }//建立表的另一種方法。
//else { p->Next = tmp; p = tmp; tmp->Next = NULL; }
L->Next = tmp;
L = L->Next;
}
L->Next = NULL;
L = original;
}
/**********雙向鏈表初始化******/
void LL_init(ListL &L, int n = 1)
{
int num[10] = { 2,2,3,4,5,6,7,8,9,10 };
int num1[10] = { 2, 2, 8, 12,13, 14, 17, 18, 20, 22 };
int num2[10] = { 2, 2, 2, 5, 10, 15, 16, 18, 20, 30 };
int num3[10] = { 2,4,6,8,10,12,14,16,18,20 };
if (n == 1)
{
for (int i = 0; i < 10; i++)
{
num[i] = num1[i];
}
}
if (n == 2)
{
for (int i = 0; i < 10; i++)
{
num[i] = num2[i];
}
}
if (n == 3)
{
for (int i = 0; i < 10; i++)
{
num[i] = num3[i];
}
}
ListL tmp, original,privious;
L = (PToNNode)malloc(sizeof(LNode));//創建頭結點;
original = L;
L->Next = NULL; L->freq = 0;
for (int i = 0; i < 10; i++)
{
tmp = (PToNNode)malloc(sizeof(struct LNode));
tmp->Date = num[i]; tmp->prior = L; tmp->freq = 0;
L->Next = tmp;  L = L->Next;
}
L->Next = original; original->prior = L;
L = original;
}
/********2.11********/
void va_init(Sqlist &L)
{
int num[10] = { 2,5,6,8,10,15,16,18,20,30 };
for (int i = 0; i < 10; i++)
{
L.elem[i] = num[i];
L.length++;
}
}
Status XInsert_Sq(Sqlist &L, int X) //在線性表中插入X;
{
ElemType *newbase;
int temp=0,num=0;
if (L.length >= L.listsize) {
newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
if (!newbase)exit(OVERFLOW);
L.listsize += LISTINCREMENT;
}
for (int i = 0; i < L.length; i++)
{
if (L.elem[i] >= X)
{
num = i;
break;
}
}
for (int i = L.length-1; i >= num; i--)
{
L.elem[i+1] = L.elem[i];
}
L.elem[num] = X;
L.length++;
return OK;
}
/********2.12********/
void A_init(Sqlist &A)
{
int num[6] ={ 'x','y','y','z','x','z' };
for (int i = 0; i < 6; i++)
{
A.elem[i] = num[i];
A.length++;
}
}
void B_init(Sqlist &B)
{
int num[8] = { 'x','y','y','z','y','x','x','z' };
for (int i = 0; i<8; i++)
{
B.elem[i] = num[i];
B.length++;
}
}
int Compare_Sq(const Sqlist &A,const Sqlist &B)//比較兩個線性表
{
int length=0,num=0;
Sqlist A1, B1;
InitList_Sq(A1);
InitList_Sq(B1);
length = A.length < B.length ? A.length : B.length;
for (int i = 0; i < length; i++)
{
if (A.elem[i] == B.elem[i])
{
num++;
}
else break;
}
/*也可以通過直接判斷A.elem[num+1]與B.elem[num+1]來實現*/
if (num == A.length) A1.length = 0; //建立A';
for (int i = num; i < A.length; i++)
{
A1.elem[i - num] = A.elem[i];//A1.length=A.length-num;
A1.length++;
}
if (num == B.length) B1.length = 0; //建立B';
for (int i = num; i < B.length; i++)
{
B1.elem[i - num] = B.elem[i];//B1.length=B.length-num;
B1.length++;
}
if (A1.length == 0 && B1.length == 0)
{
return 0;//A=B;
}
else if(A1.elem[0]<B1.elem[0])
{
return 1;//A<B;
}
else if (A1.elem[0] > B1.elem[0])
{
return -1;//A>B;
}
}
/********2.13********/
Location LOCATE(List &L, ElemType &e)
{
Location original;
while (L->Next != NULL && L->Date != e)
{
L = L->Next;
}
return L;
}
/********2.14*********/
ElemType LENGTH(List &L)//返回鏈表長度
{
int num=0;
Location original;
original = L;
while (L->Next != NULL)
{
num++;
L = L->Next;
}
L = original;
return num;
}
/********2.15*******/
List Connect(List &a, List &b,int m,int n)//m爲鏈表a的長度,n爲鏈表b的長度
{//將a鏈表與b鏈表鏈接起來給c
List c;
if (m <= n)
{
c = a;
while (a->Next != NULL)
{
a = a->Next;
}
a->Next = b->Next;
}
else
{
c = b;
while (b->Next != NULL)
{
b = b->Next;
}
b->Next = a->Next;
}
return c;
}
/*********2.19*********/
void deleteMN(List &L,const int mink,const int maxk)//刪除表中所有大於mink並且小於maxk的元素
{
Location P = L, tmp;
while ( mink < maxk && P->Next != NULL)
{
tmp = P->Next;//保留前驅
if (tmp->Date > mink)
{
if (tmp->Date < maxk)
{
P->Next = tmp->Next;
free(tmp);
}
else {
break;
}
}
else {
P = P->Next;
}
}
}
/************2.21************/
void Sq_inversion(Sqlist &L)//實現線性表的就地逆置
{
ElemType temp;
for (int i = 0; i < L.length/2; i++)
{
temp = L.elem[i];
L.elem[i] = L.elem[L.length - 1 - i];
L.elem[L.length - 1 - i] = temp;
}
}
/************2.22************/
void List_inversion(List &L)//實現鏈表的就地逆置
{
List P = L->Next,Privious=L,temp=L,First=P;
while (P->Next != NULL)
{
L->Next = P;
temp = P->Next;
P->Next = Privious;//記住先前的位置
Privious = P;
P = temp;
}
P->Next = L->Next;
L->Next = P;
First->Next = NULL;
}
/************2.24************/
List Merge(List &A, List &B)//A,B都爲遞增序列,故返回合併的序列也爲遞增序列;
{
List C=A,original=A;
A = A->Next; B = B->Next;
while (A != NULL && B != NULL)
{
if (A->Date <= B->Date)
{
C->Next = A;
A = A->Next;
}
else {
C->Next = B;
B = B->Next;
}
C = C->Next;
}
if (A != NULL) { C->Next = A; }
if (B != NULL) { C->Next = B; }
return original;
}
/************2.27************/
Sqlist gatherSq(Sqlist &A, Sqlist &B) //順序表求A與B的交集
{
Sqlist C; InitList_Sq(C); C.elem[0] = -1;//定義C的第一個成員讓其與A不一樣
ElemType i = 0, j = 0, num = 0, index = 0;
while (i < A.length && j < B.length)
{
if(A.elem[i] == B.elem[j] && C.elem[index]!= A.elem[i])

C.elem[num] = A.elem[i]; num++; 
index = num - 1;
C.length++; i++;
}
if((A.elem[i] < B.elem[j])
|| (A.elem[i] == B.elem[j] && C.elem[index] == A.elem[i])) 
{  i++; } //爲了避免C的元素重複一次
if (B.elem[j] < A.elem[i]) { j++; }
}
return C;
}
/************2.28************/
List gatherL(List &A, List&B)//線性表求A與B的交集,釋放A中無用的結點,B執行完後會回到原結點
{
List C = A, originalA = A,originalB=B,tmp; C->Date = -1;//定義C的一個特徵值方便下面進行
A = A->Next; B = B->Next;
while (A != NULL && B != NULL)
{
if (A->Date == B->Date && C->Date != A->Date)
{
C->Next=A;
C = C->Next;
C->Date = A->Date;
A = A->Next;
}
if(A != NULL && B != NULL)
{
if (A->Date < B->Date  || (A->Date == B->Date && C->Date == A->Date)) { tmp = A->Next; free(A); A = tmp; }
if (A->Date > B->Date) { tmp = B->Next; B = tmp; } //free(B);
}
}
C->Next = NULL;
B = originalB;
return originalA;
}
/************2.29************/
Sqlist delete_mixSq(Sqlist &A, Sqlist &B, Sqlist &C)
{
ElemType i=0,j=0;
B = gatherSq(B, C); 
B = gatherSq(A, B);
if (B.length == 0)
{
return A;
}
else
{
while (j < B.length && i < A.length)
{
if (A.elem[i] == B.elem[j] )
{
Delete_Sq(A, i+1); //刪除時elem會遷移一個單位;
if (A.elem[i] != B.elem[j])
j++;
}
else i++;
}
}
return A;
}
/************2.30************/
List delete_mixL(List &A, List &B, List &C) //除去A中B與C的交集;
{
List temp,previous,original;
original = A;
B = gatherL(C, B);
B = gatherL(B, A);
Show_List(A);
if (B->Next == NULL)
{
return A;
}
else
{
B = B->Next; previous = A; A = A->Next;
while (B != NULL && A != NULL)
{
if (B->Date == A ->Date)
{
temp = A->Next; previous->Next = temp; 
free(A); A = temp;
if (B->Date != A->Date)//爲了防止錯過下一個值的判斷,所以應在確保這次A裏面的元素全刪
{   //完了之後,將B指向下一個驅動元
B = B->Next;
}
}
else { previous = A; A = A->Next; }//這裏一定要留有前驅,才方便後面刪去
}
}
A->Next = NULL;
A = original;
return A;
}
/************2.38************/
ListL LOCATE_L(ListL &L, ElemType &e)//返回訪問元素e的位置,並且記錄訪問頻度,使得被訪問多的結點
{ // 總是靠近頭結點
ListL original=L,tmp,position;
while (L->Next != original && L->Date != e)
{
L = L->Next;
}
L->freq++; position = L;
while (L->prior!= original)
{
if (L->freq > L->prior->freq)//需解決的問題涉及三個節點
{
tmp = L->prior; L->prior = tmp->prior; tmp->Next = L->Next;
L->Next->prior = tmp;
tmp->prior->Next = L;//這個很關鍵,經常會漏掉
tmp->prior = L; L->Next = tmp;
}
else L = L->prior;
}
L = position;
return L;
}
/************2.39************/
ElemType Caculate_Polyn(const SqPoly &L,ElemType x0)//計算一元多項式x0的值
{
int value=0;
for (int i = 0; i < L.length; i++)
{
value = value + L.data[i].coef*pow(x0, L.data[i].exp);
}
return value;
}
/************2.41************/
PolyNode_L derivation(PolyNode_L &L)//求一元多項式的導數
{
PolyNode_L Position = L,original=L; L = L->Next;
while (L->Next != NULL)
{
L->data.coef = L->data.exp*L->data.coef;
L->data.exp--;
Position = L;
L = L->Next;
}
free(L); Position->Next = NULL;
L = original;
return L;
}
void main()
{
/****2.11****/
/* Sqlist va;
InitList_Sq(va);
va_init(va);
XInsert_Sq(va, 15);
Show_Sq(va);*/


/****2.12****/
/*Sqlist A, B;
InitList_Sq(A);
InitList_Sq(B);
A_init(A);
B_init(B);
int result = Compare_Sq(A, B);
cout << result << endl;*/


/****2.13****/
/*List L;
int e = 5;
L_init(L);
Show_List(L, 10);
Location p=LOCATE(L, e);
cout << p->Next->Date;*/

/****2.14****/
/*List L;
L_init(L);
int num = LENGTH(L);
cout << num << endl;
DeleteList(L);*/


/****2.15****/
/*List a, b, c;
L_init(a,1); L_init(b);
c = Connect(a, b, 10, 10);
Show_List(c);*/


/****2.19****/
/*List a; L_init(a);
deleteMN(a, 10, 30);
Show_List(a);*/


/****2.21****/
/*Sqlist L; InitList_Sq(L); Sq_init(L);
Sq_inversion(L);
Show_Sq(L);*/

/****2.22****/
/*List L; L_init(L);
List_inversion(L);
Show_List(L);*/


/****2.24****/
/*List A, B; L_init(A); L_init(B,2);
A = Merge(A, B);
List_inversion(A);
Show_List(A);*/


/****2.27****/
/*Sqlist A, B;
InitList_Sq(A); InitList_Sq(B);
Sq_init(A,1); Sq_init(B,2);
A=gatherSq(A, B); Show_Sq(A);*/


/****2.28****/
/*List A, B; L_init(A); L_init(B, 2);
A = gatherL(A, B); Show_List(A);*/


/****2.29****/
/*Sqlist A, B,C;
InitList_Sq(A); InitList_Sq(B); InitList_Sq(C);
Sq_init(A, 1); Sq_init(B, 2); Sq_init(C,3);
delete_mixSq(A, B, C);
Show_Sq(A);*/


/****2.30****/
/*List A, B, C;
L_init(A, 1); L_init(B, 2); L_init(C, 3);
delete_mixL(A, B, C);
Show_List(A);*/


/****2.33****/
/*ListL A,original; LL_init(A, 3);
original = A;
ElemType e = 18;
LOCATE_L(A, e); 
A = original;
Show_LList(A);*/


/****2.39****/
/*SqPoly L; ElemType x0,value; Init_Polyn(L);
cout << "Please enter x0: "; cin >> x0;
value=Caculate_Polyn(L,x0);
cout << "You will get the value: " << value << endl;*/


/****2.41****/
PolyNode_L L;
CreatePolyn_L(L);
Show_SqPolyn(L);
derivation(L);
Show_SqPolyn(L);
system("pause");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章