目录

【问题描述】
输入一个单向链表,输出该链表中倒数第k个结点,链表的最后一个结点是倒数第1个节点。
【输入形式】
输入第一位为K值,其后接一串以空格分隔的整型值。
【输出形式】
输出为倒数第K个结点的值,若无,则输出Not Found
【样例输入】
3 13 45 54 32 1 4 98 2
【样例输出】
4
【样例说明】
K值为3,则输出链表倒数第3个结点的值,为4;数据输入间以空格隔开
【评分标准】
本题要综合输出正确性及使用的数据结构。需由输入数据构建单链表。不使用链表的将不得分。
- #include
- #include
-
- typedef struct Node {
- int num;
- struct Node* next;
- } Node, * LinkList;
-
- int main() {
- LinkList head = NULL;
- LinkList tail = NULL;
- int k;
- scanf("%d", &k);
- int n;
- while (scanf("%d", &n) != EOF) {
- LinkList newNode = (LinkList)malloc(sizeof(Node));
- newNode->num = n;
- newNode->next = NULL;
- if (head == NULL) {
- head = newNode;
- tail = newNode;
- } else {
- tail->next = newNode;
- tail = tail->next;
- }
- }
- LinkList p = head;
- int count = 0;
- while (p != NULL) {
- count++;
- p = p->next;
- }
- if (k <= 0 || k > count) {
- printf("Not Found\n");
- } else {
- p = head;
- for (int i = 0; i < count - k; i++) {
- p = p->next;
- }
- printf("%d\n", p->num);
- }
- p = head;
- while (p != NULL) {
- LinkList temp = p;
- p = p->next;
- free(temp);
- }
- return 0;
- }
- #include
- #include
-
- typedef struct Node {
- int num;
- struct Node* next;
- } Node, * LinkList;
-
- int main() {
- LinkList head = NULL;
- LinkList tail = NULL;
- int k;
- scanf("%d", &k);
- int n;
- while (scanf("%d", &n) != EOF) {
- LinkList newNode = (LinkList)malloc(sizeof(Node));
- newNode->num = n;
- newNode->next = NULL;
- if (head == NULL) {
- head = newNode;
- tail = newNode;
- } else {
- tail->next = newNode;
- tail = tail->next;
- }
- }
- LinkList p = head;
- LinkList temp=head;
- if (k <= 0) {
- printf("Not Found\n");
- } else {
- p = head;
- temp=head;
- while(k && temp){
- temp=temp->next;
- k--;
- }
- while(temp){
- temp=temp->next;
- p=p->next;
- }
- if(k > 0){
- printf("Not Found\n");
- return 0;
- }
- printf("%d\n", p->num);
- }
- return 0;
- }
【问题描述】
将整数数组A[0..n],将其分为两部分,左边所有元素为奇数,右边所有元素为偶数。数组元素个数不超过1000。
【输入形式】
以逗号隔开的所有元素
【输出形式】
依次打印调整后的数组元素,元素间以逗号隔开。奇数序列和偶数序列分别按原序列中的顺序依次输出
【样例输入】
1,2,33,8,5
【样例输出】
1,33,5,2,8
【评分标准】
- #include
- #include
-
- int main() {
- int n;
- int arr[1000];
- int size = 0;
- while (scanf("%d,", &n) != EOF) {
- arr[size] = n;
- size++;
- }
-
- int *arr1 = (int*) malloc(size * sizeof(int));
- int *arr2 = (int*) malloc(size * sizeof(int));
- int size1 = 0, size2 = 0;
-
- for (int i = 0; i < size; i++) {
- if (arr[i] % 2 != 0) {
- arr1[size1] = arr[i];
- size1++;
- } else {
- arr2[size2] = arr[i];
- size2++;
- }
- }
-
- for (int i = 0; i < size1; i++) {
- printf("%d", arr1[i]);
- if (i < size1 - 1) {
- printf(",");
- }
- }
- if(size1>=1&&size2!=0){
- printf(",");
- }
-
- for (int i = 0; i < size2; i++) {
- printf("%d", arr2[i]);
- if (i < size2 - 1) {
- printf(",");
- }
- }
-
- free(arr1);
- free(arr2);
- return 0;
- }
【问题描述】
编写一个程序用单链表存储多项式,并实现两个一元多项式A与B相加的函数。A,B刚开始是无序的,A与B之和按降序排列。例如:
多项式A: 1.2X^0 2.5X^1 3.2X^3 -2.5X^5
多项式B: -1.2X^0 2.5X^1 3.2X^3 2.5X^5 5.4X^10
多项式A与B之和:5.4X^10 6.4X^3 5X^1
【输入形式】
任意两个多项式A和B
【输出形式】
多项式中某一项的系数与指数,系数保留一位小数
【输入样例】
1.2 0 2.5 1 3.2 3 -2.5 5 -1.2 0 2.5 1 3.2 3 2.5 5 5.4 10 2
【输出样例】
6.4 3
【样例说明】
第一个多项式的系数与指数对,以空格隔开
第二个多项式的系数与指数对,以空格隔开
输出第2项的系数与指数,系数与指数间用空格隔开,系数保留一位小数
【评分标准】
必须用链表实现
- #include
- #include
-
- typedef struct Node {
- float coef;
- int exp;
- struct Node* next;
- } Node;
-
- Node* createNode(float coef, int exp) {
- Node* newNode = (Node*)malloc(sizeof(Node));
- newNode->coef = coef;
- newNode->exp = exp;
- newNode->next = NULL;
- return newNode;
- }
-
- void insertNode(Node** head, float coef, int exp) {
- Node* newNode = createNode(coef, exp);
- if (*head == NULL || (*head)->exp < exp) {
- newNode->next = *head;
- *head = newNode;
- } else {
- Node* temp = *head;
- while (temp->next != NULL && temp->next->exp >= exp) {
- temp = temp->next;
- }
- newNode->next = temp->next;
- temp->next = newNode;
- }
- }
-
- Node* addPolynomials(Node* poly1, Node* poly2) {
- Node* result = NULL;
- while (poly1 && poly2) {
- if (poly1->exp > poly2->exp) {
- insertNode(&result, poly1->coef, poly1->exp);
- poly1 = poly1->next;
- } else if (poly1->exp < poly2->exp) {
- insertNode(&result, poly2->coef, poly2->exp);
- poly2 = poly2->next;
- } else {
- float sum = poly1->coef + poly2->coef;
- if (sum) {
- insertNode(&result, sum, poly1->exp);
- }
- poly1 = poly1->next;
- poly2 = poly2->next;
- }
- }
- while (poly1 || poly2) {
- if (poly1) {
- insertNode(&result, poly1->coef, poly1->exp);
- poly1 = poly1->next;
- }
- if (poly2) {
- insertNode(&result, poly2->coef, poly2->exp);
- poly2 = poly2->next;
- }
- }
- return result;
- }
-
-
- int main() {
- Node* poly1 = NULL;
- Node* poly2 = NULL;
- float coef;
- int exp;
- char ch;
- while (scanf("%f %d%c", &coef, &exp, &ch)) {
- insertNode(&poly1, coef, exp);
- if (ch == '\n') break;
- }
- while (scanf("%f %d%c", &coef, &exp, &ch)) {
- insertNode(&poly2, coef, exp);
- if (ch == '\n') break;
- }
-
- Node* result = addPolynomials(poly1, poly2);
-
- int pos;
- scanf("%d", &pos);
- int i;
- for (i = 1; i < pos; i++) {
- if (result) {
- result = result->next;
- }
- }
- if (result) {
- printf("%.1f %d\n", result->coef, result->exp);
- }
- return 0;
- }
【问题描述】
设将n(n>1)个整数存放在一维数组R中。试设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移P(P>0)个位置。
例如,假设P
循环移动的位数,数组中数据的个数,循环前的数组
【输出形式】
循环后的数组
【样例输入】
3 5 1 2 3 4 5
【样例输出】
4 5 1 2 3
【样例说明】
请大家注意,循环位移的位数可能超过数组中元素个数;输入与输出的数据均以空格分割,其中输入的数据中第一个是循环移位的位数,第二个是数组中数据的个数,后面的是数组中的数据。
【评分标准】
除了提交之后自动判分之外,还会根据代码的时间复杂度酌情给分,请大家尽量降低空间、时间复杂度
- #include
- #include
-
- void reverseArr(int *arr, int start, int end) {
- while (start < end) {
- int temp = arr[start];
- arr[start] = arr[end];
- arr[end] = temp;
- start++;
- end--;
- }
- }
-
- void leftRotate(int *arr, int p, int n) {
- reverseArr(arr, 0, p - 1);
- reverseArr(arr, p, n - 1);
- reverseArr(arr, 0, n - 1);
- }
-
- int main() {
- int p, num, i;
- scanf("%d", &p);
- scanf("%d", &num);
- p = p % num;
- int *arr = (int *)malloc(num * sizeof(int));
- for (i = 0; i < num; i++) {
- scanf("%d", &arr[i]);
- }
-
- leftRotate(arr, p, num);
-
- for (i = 0; i < num; i++) {
- printf("%d", arr[i]);
- if (i < num - 1) {
- printf(" ");
- }
- }
- printf("\n");
-
- free(arr);
- return 0;
- }