/*===========================================================================*/
/*程序名稱:2004_1.c */
/*程序目的:計算一個“零幺串”當中最長的零/幺串 */
/*Writen by Apechn ,Soft Lab of JLU */
/*===========================================================================*/#include
考研試題
/*====================================================================================*/
/*程序名稱:2004_2.c */
/*程序目的:兩個多項式相加 */
/*Writen by Apechn ,Soft Lab of JLU */
/*====================================================================================*/
#include
#include
struct list /* 節點結構聲明 */
{
int power; /* 多項式中變量的冪 */
int coeff; /* 多項式中變量的系數 */
struct list *next;
};
typedef struct list node;
typedef node *poly;
/*-------------------------------------*/
/* 打印出一個多項式的各項 */
/*-------------------------------------*/
void printPoly(poly head)
{
poly pointer; /* 臨時指針變量 */
pointer = head;
while (pointer != NULL) /* 打印各節點 */
{
printf("[%d,%d] ",pointer->coeff,pointer->power);
pointer = pointer->next;
}
printf("/n");
}
/*------------------------------------------------------------------------------*/
/* 從鍵盤輸入一個多項式的項數和各項的冪和系數,多項式的系數不能為零 */
/*------------------------------------------------------------------------------*/
poly createPoly(poly head) /* 從鍵盤輸入一個多項式的項數和各項的冪和系數 */
{
poly newNode; /* 臨時節點 */
poly pointer;
int n,i;
int coeffTemp,powerTemp; /* 臨時變量 */
head = (poly) malloc(sizeof(node)); /* 內存配置 */
if (head == NULL)
printf("Memory allocate Failure!!/n"); /* 內存配置失敗 */
else
{
printf("請輸入要創建的多項式的項數:/n");
scanf("%d",&n);
if (n == 0)
return NULL;
printf("請按x降冪依次輸入各項的系數和冪:/n");
scanf("%d%d",&coeffTemp,&powerTemp);/* 輸入多項式一項的系數和冪 */
head->coeff = coeffTemp; /* 定義首節點 */
head->power = powerTemp;
head->next = NULL;
pointer = head;
for (i = 1;i < n;i++) /* 依次定義其它節點 */
{
scanf("%d%d",&coeffTemp,&powerTemp); /* 輸入各項的系數和冪 */
newNode = (poly) malloc(sizeof(node));
newNode->coeff = coeffTemp;
newNode->power = powerTemp;
newNode->next = NULL;
pointer->next = newNode; /* 將新定義的節點連接到原鏈表的表尾 */
pointer = newNode; /* pointer指針后移 */
}
}
printPoly(head);
return head;
}
/*-----------------------------------*/
/* 釋放一個鏈表的空間 */
/*-----------------------------------*/
void freeList(poly head)
{
poly pointer; /* 臨時指針變量 */
while (head != NULL)
{
pointer = head;
head = head->next;
free(pointer);
}
}
/*--------------------------------------------*/
/* 計算兩個多項式的和,并將結果存入另一個鏈表 */
/*--------------------------------------------*/
poly addPoly(poly head1,poly head2)
{
poly pointer1,pointer2,pointer,newNode,head;/* 臨時指針變量 */
pointer1 = head1;
pointer2 = head2;
head = (poly) malloc(sizeof(node));
pointer = head;
while ((pointer1 != NULL) || (pointer2 != NULL)) /* 若兩個多項式至少有一個沒有訪問結束 */
{
if (pointer1 !=NULL && pointer2 != NULL &&(pointer1->power > pointer2->power))
{/* 若兩個多項式當前指針指向的項的冪不相等 */
newNode = (poly) malloc(sizeof(node));
newNode->power = pointer1->power;
newNode->coeff = pointer1->coeff;
newNode->next = NULL;
pointer->next = newNode;
pointer = newNode;
pointer1 = pointer1->next;
}
if (pointer1 !=NULL && pointer2 != NULL &&(pointer1->power < pointer2->power))
{/* 若兩個多項式當前指針指向的項的冪不相等 */
newNode = (poly) malloc(sizeof(node));
newNode->power = pointer2->power;
newNode->coeff = pointer2->coeff;
newNode->next = NULL;
pointer->next = newNode;
pointer = newNode;/* 指向存儲結果的鏈表的指針后移 */
pointer2 = pointer2->next;
}
if (pointer1 !=NULL && pointer2 != NULL &&(pointer1->power == pointer2->power))
{ /* 若兩個多項式當前指針指向的項的冪相等 */
newNode = (poly) malloc(sizeof(node));
newNode->power = pointer1->power;
newNode->coeff = pointer1->coeff + pointer2->coeff;
newNode->next = NULL;
pointer->next = newNode;
pointer = newNode;/* 指向存儲結果的鏈表的指針后移 */
pointer1 = pointer1->next;
pointer2 = pointer2->next;
}
if (pointer1 == NULL && pointer2 != NULL)
{
newNode = (poly) malloc(sizeof(node));
newNode->power = pointer2->power;
newNode->coeff = pointer2->coeff;
newNode->next = NULL;
pointer->next = newNode;
pointer = newNode;/* 指向存儲結果的鏈表的指針后移 */
pointer2 = pointer2->next;
}
if (pointer2 == NULL && pointer1 != NULL)
{
newNode = (poly) malloc(sizeof(node));
newNode->power = pointer1->power;
newNode->coeff = pointer1->coeff;
newNode->next = NULL;
pointer->next = newNode;
pointer = newNode;
pointer1 = pointer1->next;
}
}
pointer = head; /* 由于多用了一個節點,這3行代碼將多出的節點釋放 */
head = head->next;
free(pointer);
return (head);
}
/*------------------------------------------------------------------------------*/
/* 主程序 */
/*------------------------------------------------------------------------------*/
void main()
{
poly p,q,r; /* 定義三個代表多項式的鏈表 */
printf("這是多項式p:/n"); /* 創建多項式p */
p = createPoly(p);
printf("這是多項式q:/n"); /* 創建多項式q */
q = createPoly(q);
r = (poly) malloc(sizeof(node));
printf("這是多項式p與多項式q的和r:/n");
r = addPoly(p,q); /* 將多項式p和多項式q的和賦值給r */
printPoly(r);
freeList(p); /* 釋放程序中使用過的鏈表所占用的空間 */
freeList(q);
freeList(r);
}
考研試題
/*=============================================================================*/
/*程序名稱:2004_3.c */
/*程序目的:求sin(x)的近似值 */
/*Writen by Apechn ,Soft Lab of JLU */
/*=============================================================================*/
#include
#include
#define MIN 0.00005 /* 設置運算停止條件 */
/*------------------------------------------------------------------------------*/
/* 計算弧度數為angle的角的正弦值第i項 */
/*------------------------------------------------------------------------------*/
float spill(int i,float angle) /* 計算第i項 */
{
int symbol,j;
float temp = angle; /* 臨時變量 */
if (i % 2) /* 設置該項的符號 */
symbol = 1;
else
symbol = -1;
if (i == 1) /* 若只需要計算一項,直接返回角度值 */
return (angle);
for (j = 2;j <= i;j++) /* 循環計算一項的值 */
{
temp *= angle * angle / ((2 * j - 2) * (2 * j - 1));
}
temp *= symbol;
return (temp);
}
/*------------------------------------------------------------------------------*/
/* 遞歸求解sin(angle)的近似值,其中angle表示用戶輸入的弧度值 */
/*------------------------------------------------------------------------------*/
float f(int i,float angle)
{
float temp; /* 臨時變量 */
if (i == 1) /* 遞歸出口 */
return angle;
temp = spill(i,angle); /* 需要加上的項 */
return (f((i - 1),angle) + temp); /* 遞歸運算 */
}
/*------------------------------------------------------------------------------*/
/* 計算需要的級數的項數,其中angle表示用戶輸入的弧度值 */
/*------------------------------------------------------------------------------*/
int loopTime(float angle)
{
int i = 1;
float seed = angle; /* 臨時變量 */
while ((seed >= MIN) || (seed <= (-1 * MIN))) /* 循環條件 */
{
i++;
seed *= angle * angle /((2 * i -1) * (2 * i - 2)) * (-1);
}
return i;
}
/*------------------------------------------------------------------------------*/
/* 主程序 */
/*------------------------------------------------------------------------------*/
void main()
{
float x; /* 用來保存用戶輸入的弧度數 */
int count = 1; /* 用來保存需要遞歸的次數 */
float sinOfAngle = 0; /* 用來保存最終結果 */
printf("請輸入一個浮點數,它代表一個弧度值:");
scanf("%f",&x); /* 用戶從鍵盤輸入一個弧度數 */
count = loopTime(x);
sinOfAngle = f(count,x);
printf("sin %f 的近似值為 %f./n",x,sinOfAngle); /* 在屏幕上打印出最終結果 */
}
考研試題
/*=============================================================================*/
/*函數名稱:2004_4.c */
/*函數目的:遞歸的求出一個給定結構樹的高度、節點數和路徑個數 */
/*Writen by Siyee ,Soft Lab of JLU */
/*=============================================================================*/
int depth = 0; /* 用來保存深度的變量 */
void H(tree *T, int *h, int *n, int *k)
{
++*n;
++depth;
*h = max(*h, depth); /* 如果h比depth小,則更新h */
if(T->kind=='two'){ /* 若節點有兩個子節點 */
H(T->son1, h, n, k); /* 遞歸計算兩個子節點 */
H(T->son2, h, n, k);
}
else if(T->kind=='one'){ /* 若節點有一個子節點 */
H(T->son, h, n, k); /* 遞歸計算這一個子節點 */
}
else{
++*k; /* 如果是葉節點,則路徑數k增一 */
}
--depth; /* 回溯,深度減一 */
}
考研試題
/*=============================================================================*/
/*程序名稱:2004_5.c */
/*程序目的:刪除整數單鏈表中重復的節點 */
/*Writen by Apechn ,Soft Lab of JLU */
/*=============================================================================*/
#include
#include
#define N 6 /* 節點個數 */
struct list /* 節點結構聲明 */
{
int number;
struct list *next;
};
typedef struct list node;
typedef node *link;
int data[N] = {0,3,0,3,1,3}; /* 輸入數據 */
/*------------------------------------------------------------------------------*/
/* 以已有的數組為基礎建立單鏈表 */
/*------------------------------------------------------------------------------*/
link createList(link head)
{
link newNode;
link pointer; /* 函數中需要用到的臨時變量 */
int i;
head = (link) malloc(sizeof(node));
if (head == NULL) /* 若分配內存失敗 */
printf("Memory allocate Failure!!/n");
else
{
head->number = data[0]; /* 設置首節點 */
head->next = NULL;
pointer = head;
for (i = 1;i < N;i++) /* 依次設置其它節點 */
{
newNode = (link) malloc(sizeof(node));
newNode->number = data[i];
newNode->next = NULL;
pointer->next = newNode;
pointer = newNode;
}
}
return head;
}
/*------------------------------------------------------------------------------*/
/* 遞歸地刪除鏈表中的重復節點 */
/*------------------------------------------------------------------------------*/
link delSame(link head)
{
link pointer,temp = head; /* 函數中需要用到的臨時變量 */
if (head->next == NULL) /* 若head為空則直接返回 */
return head;
head->next = delSame(head->next); /* 遞歸地刪除重復節點 */
pointer = head->next;
while (pointer != NULL)
{
if (head->number == pointer->number) /* 刪除重復節點 */
{
temp->next = pointer->next;
free(pointer); /* 釋放被刪除節點所占用的空間 */
pointer = temp->next;
}
else
{
pointer = pointer->next; /* 如果沒有重復節點則指針后移 */
temp = temp->next;
}
}
return head;
}
/*------------------------------------------------------------------------------*/
/* 釋放鏈表所占用的空間 */
/*------------------------------------------------------------------------------*/
void freeList(link head)
{
link pointer; /* 臨時變量 */
while (head != NULL)
{
pointer = head;
head = head->next;
free(pointer); /* 一次釋放一個節點所占的空間 */
}
}
/*------------------------------------------------------------------------------*/
/* 打印鏈表各項 */
/*------------------------------------------------------------------------------*/
void printList(link head)
{
link pointer; /* 臨時變量 */
pointer = head;
while (pointer != NULL)
{
printf("%d ",pointer->number);
pointer = pointer->next;
}
printf("/n");
}
/*------------------------------------------------------------------------------*/
/* 主程序 */
/*------------------------------------------------------------------------------*/
void main()
{
link head;
link pointer;
head = createList(head); /* 以已有的數組為基礎建立一個鏈表 */
if (head != NULL) /* 打印未刪除重復節點前的數組 */
{
printf("初始鏈表中各元素依次如下所示:/n");
printList(head);
}
pointer = delSame(head); /* 遞歸地刪除鏈表中的重復節點 */
printf("刪除重復節點后的鏈表中各元素依次如下所示:/n");
printList(pointer); /* 打印刪除重復節點后的數組 */
freeList(head);
}