数据结构期末复习题

c 复制代码
#include <stdio.h>
#include <stdlib.h>

typedef struct LNode {
    int data;
    struct LNode *next;
} LNode, *LinkList;

LinkList CreateList(int n) {
    int i;
    LinkList head, p, q;
    head = (LinkList)malloc(sizeof(LNode));
    head->next = NULL;
    q = head;
    for (i = 0; i < n; i++) {
        p = (LinkList)malloc(sizeof(LNode));
        scanf("%d", &p->data);
        p->next = NULL;
        q->next = p;
        q = p;
    }
    return head;
}

LinkList MoveZeroLink(LinkList head) {
    LinkList p, q, zeroHead, zeroTail, noHead, noTail;
    zeroHead = (LinkList)malloc(sizeof(LNode));
    noHead = (LinkList)malloc(sizeof(LNode));
    zeroHead->next = NULL;
    noHead->next = NULL;
    zeroTail = zeroHead;
    noTail = noHead;
    p = head->next;
    while (p != NULL) {
        q = p->next;
        if (p->data == 0) {
            zeroTail->next = p;
            zeroTail = p;
            zeroTail->next = NULL;
        } else {
            noTail->next = p;
            noTail = p;
            noTail->next = NULL;
        }
        p = q;
    }
    zeroTail->next = noHead->next;
    return zeroHead;
}

void PrintList(LinkList head) {
    LinkList p;
    p = head->next;
    while (p != NULL) {
        printf("%d", p->data);
        if (p->next != NULL) {
            printf(" ");
        }
        p = p->next;
    }
}

int main() {
    int n;
    LinkList head, newHead;
    scanf("%d", &n);
    head = CreateList(n);
    newHead = MoveZeroLink(head);
    PrintList(newHead);
    return 0;
}
c 复制代码
#include <stdio.h>
#define MAXSIZE 1000

int main() {
    int m, n, i, j, k;
    int a[MAXSIZE], b[MAXSIZE], c[MAXSIZE];

    i = 0;
    j = 0;
    k = 0;

    scanf("%d %d", &m, &n);

    for (i = 0; i < m; i++) {
        scanf("%d", &a[i]);
    }

    i = 0;

    for (i = 0; i < n; i++) {
        scanf("%d", &b[i]);
    }

    i = 0;

    while (i < m && j < n) {
        if (a[i] > b[j]) {
            if (k == 0 || c[k-1] != a[i]) {
                c[k] = a[i];
                k = k + 1;
            }
            i = i + 1;
        } else if (a[i] < b[j]) {
            if (k == 0 || c[k-1] != b[j]) {
                c[k] = b[j];
                k = k + 1;
            }
            j = j + 1;
        } else {
            if (k == 0 || c[k-1] != a[i]) {
                c[k] = a[i];
                k = k + 1;
            }
            i = i + 1;
            j = j + 1;
        }
    }

    while (i < m) {
        if (k == 0 || c[k-1] != a[i]) {
            c[k] = a[i];
            k = k + 1;
        }
        i = i + 1;
    }

    while (j < n) {
        if (k == 0 || c[k-1] != b[j]) {
            c[k] = b[j];
            k = k + 1;
        }
        j = j + 1;
    }

    printf("%d\n", k);

    for (i = 0; i < k; i++) {
        printf("%d ", c[i]);
    }

    return 0;
}
c 复制代码
#include <stdio.h>

#define MAXSIZE 1000

int main() {
    int m, n, i, j, k;
    int a[MAXSIZE], b[MAXSIZE], c[MAXSIZE];

    i = 0;
    j = 0;
    k = 0;

    scanf("%d %d", &m, &n);

    for (i = 0; i < m; i++) {
        scanf("%d", &a[i]);
    }

    i = 0;

    for (i = 0; i < n; i++) {
        scanf("%d", &b[i]);
    }

    i = 0;

    while (i < m && j < n) {
        if (a[i] > b[j]) {
            if (k == 0 || c[k-1] != a[i]) {
                c[k] = a[i];
                k = k + 1;
            }
            i = i + 1;
        } else if (a[i] < b[j]) {
            if (k == 0 || c[k-1] != b[j]) {
                c[k] = b[j];
                k = k + 1;
            }
            j = j + 1;
        } else {
            if (k == 0 || c[k-1] != a[i]) {
                c[k] = a[i];
                k = k + 1;
            }
            i = i + 1;
            j = j + 1;
        }
    }

    while (i < m) {
        if (k == 0 || c[k-1] != a[i]) {
            c[k] = a[i];
            k = k + 1;
        }
        i = i + 1;
    }

    while (j < n) {
        if (k == 0 || c[k-1] != b[j]) {
            c[k] = b[j];
            k = k + 1;
        }
        j = j + 1;
    }

    printf("%d\n", k);

    for (i = 0; i < k; i++) {
        printf("%d ", c[i]);
    }

    return 0;
}


#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20


typedef struct LNode {
    int data;
    struct LNode *next; 
} LNode, *LinkList;

void CreatList_H(LinkList L, int n);
LinkList mergelinklist(LinkList La,LinkList Lb);

int main()
{
    LinkList La,Lb,p;
    int n,m;
    scanf("%d %d",&n,&m);
    La=(LNode*) malloc(sizeof(LNode));
    CreatList_H(La,n);
    Lb=(LNode*) malloc(sizeof(LNode));
    
    CreatList_H(Lb,m);
    
    La=mergelinklist(La,Lb);
    
    p=La->next;
    while(p){
        printf("%d ",p->data);
        p=p->next;
    }
    return 0;   
}



void CreatList_H(LinkList L, int n)
{
    LinkList p;
    int i;
    L->next=NULL;
    for(i=0;i<n;i++)
    {
        p=(LinkList)malloc(sizeof(LNode));
        scanf("%d",&p->data);
        
        p->next = L->next;
        L->next = p;
    }
}



LinkList mergelinklist(LinkList La,LinkList Lb)
{
    LinkList pa,pb,pc,Lc,q;
    pa=La->next;
    pb=Lb->next;
    Lc=La;
    pc=Lc;
    while(pa&&pb){
        if(pa->data<pb->data)
        {
            pc->next=pa;
            pc=pa;
            pa=pa->next;
        }
        else if(pa->data==pb->data){
            pc->next = pa;
            pc = pa;
            pa = pa->next;
            
            q = pb;
            pb = pb->next;
            free(q);
        }
        else{
            pc->next=pb;
            pc=pb;
            pb=pb->next;
        }
    }
    
    if(pa) pc->next = pa;
    else pc->next = pb;
    
    return Lc;
}
c 复制代码
/***字符串匹配算法***/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
#define MAXSTRLEN 255           /*用户可在255以内定义最长串长*/
typedef char SString[MAXSTRLEN+1];        /*0号单元存放串的长度*/

Status StrAssign(SString T, char *chars) { /*生成一个其值等于chars的串T*/
    int i;
    if (strlen(chars) > MAXSTRLEN)
        return ERROR;
    else {
        T[0] = strlen(chars);
        for (i = 1; i <= T[0]; i++)
            T[i] = *(chars + i - 1);
        return OK;
    }
}

/*算法4.1 BF算法*/
int Index(SString S, SString T, int pos)
{
    /*返回模式T在主串S中第pos个字符之后第一次出现的位置。若不存在,则返回值为0*/
    /*其中,T非空,1≤pos≤StrLength(S)*/
    
int i = pos, j = 1;
    while (i <= S[0] && j <= T[0])
    {
        if (S[i] == T[j])
        {
            i++;
            j++;
        }
        else
        {
            i = i - j + 2;
            j = 1;
        }
    }
    if (j > T[0])
        return i - T[0];
    else
        return 0;

}

int main()
{
    SString S, T;
    
StrAssign(S, "bbaaabbaba"); 
/*生成一个其值等于"bbaaabbaba"的串S*/
    
 StrAssign(T, "abb"); 
/*生成一个其值等于"abb"的串T*/
    printf("Index result=%d\n",Index(S,T,1));
    return 0;
}
c 复制代码
#include <stdio.h>
#define MAX_SIZE 1000  // 数组最大长度,可根据需求调整

int main()
{
    int n;
    int arr[MAX_SIZE];
    int target;
    int process[MAX_SIZE];  // 记录每一次mid位置的元素值
    int proc_count = 0;     // 记录过程的步数
    int left, right, mid;
    int index = -1;         // 目标值下标,初始为-1表示未找到
    int i;

    // 1. 读取数组长度n
    scanf("%d", &n);

    // 2. 读取逗号分隔的有序数组
    for (i = 0; i < n; i++)
    {
        if (i == n - 1)
            scanf("%d", &arr[i]);   // 最后一个元素后没有逗号
        else
            scanf("%d,", &arr[i]);  // 非最后一个元素,读取数字+逗号
    }

    // 3. 读取待查找的目标值k
    scanf("%d", &target);

    // 4. 折半查找核心逻辑
    left = 0;
    right = n - 1;
    while (left <= right)
    {
        mid = (left + right) / 2;          // 向下取整计算中间位置
        process[proc_count++] = arr[mid];  // 记录本次mid位置的元素

        if (arr[mid] == target)
        {
            index = mid;  // 找到目标,记录下标
            break;
        }
        else if (arr[mid] < target)
        {
            left = mid + 1;  // 目标值更大,查找右半区间
        }
        else
        {
            right = mid - 1; // 目标值更小,查找左半区间
        }
    }

    // 5. 输出查找过程(逗号分隔)
    for (i = 0; i < proc_count; i++)
    {
        if (i == 0)
            printf("%d", process[i]);
        else
            printf(",%d", process[i]);
    }
    printf("\n");

    // 6. 输出查找结果
    if (index != -1)
        printf("%d\n", index);
    else
        printf("no\n");

    return 0;
}
c 复制代码
#include <stdio.h>
#include <stdlib.h>

// qsort 比较函数:升序排序
int cmp(const void *a, const void *b)
{
    return *(int *)a - *(int *)b;
}

int main()
{
    int arr[10000];  // 数组最大容量,可根据需求调整
    int n = 0;       // 数组实际元素个数
    int num, k;
    int i;
    char ch;

    // 1. 读取第一行整数数组(以换行结束)
    while (scanf("%d", &num) == 1)
    {
        arr[n++] = num;
        ch = getchar();
        if (ch == '\n')  // 遇到换行,第一行读取结束
            break;
        ungetc(ch, stdin); // 非换行字符放回输入流,继续读取下一个数字
    }

    // 2. 读取 k 值
    scanf("%d", &k);

    // 3. 快速排序:从小到大
    qsort(arr, n, sizeof(int), cmp);

    // 4. 输出最小的 k 个数字,空格分隔
    for (i = 0; i < k; i++)
    {
        if (i == 0)
            printf("%d", arr[i]);
        else
            printf(" %d", arr[i]);
    }
    printf("\n");

    return 0;
}
c 复制代码
#include <stdio.h>
#include <stdlib.h>

typedef struct BiTNode {
    char data;
    struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

// 前序建立二叉树(#为空)
void CreateBiTree(BiTree *T) {
    char ch;
    ch = getchar();
    if (ch == '#') {
        *T = NULL;
    } else {
        *T = (BiTree)malloc(sizeof(BiTNode));
        (*T)->data = ch;
        CreateBiTree(&(*T)->lchild);
        CreateBiTree(&(*T)->rchild);
    }
}

// 中序遍历
void InOrder(BiTree T) {
    if (T) {
        InOrder(T->lchild);
        printf("%c", T->data);
        InOrder(T->rchild);
    }
}

// 后序遍历
void PostOrder(BiTree T) {
    if (T) {
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        printf("%c", T->data);
    }
}

// 统计结点数
int Count(BiTree T) {
    if (!T) return 0;
    return Count(T->lchild) + Count(T->rchild) + 1;
}

int main() {
    BiTree T;
    CreateBiTree(&T);
    
    InOrder(T);
    printf("\n");
    
    PostOrder(T);
    printf("\n");
    
    printf("%d\n", Count(T));
    return 0;
}
c 复制代码
#include <stdio.h>
#define MAXSIZE 100

// 顺序栈结构定义
typedef struct {
    char data[MAXSIZE];
    int top;
} SqStack;

// 初始化栈
void InitStack(SqStack *S) {
    S->top = -1;
}

// 入栈
int Push(SqStack *S, char e) {
    if (S->top == MAXSIZE - 1) return 0;
    S->data[++S->top] = e;
    return 1;
}

// 出栈
int Pop(SqStack *S, char *e) {
    if (S->top == -1) return 0;
    *e = S->data[S->top--];
    return 1;
}

int main() {
    SqStack S;
    InitStack(&S);

    char str[MAXSIZE];
    char c;
    int len = 0;

    // 读取输入直到 #
    while ((c = getchar()) != '#') {
        str[len++] = c;
    }
    str[len] = '\0';

    // 前一半入栈
    int i;
    for (i = 0; i < len / 2; i++) {
        Push(&S, str[i]);
    }

    // 后半开始位置
    int start = (len % 2 == 0) ? len / 2 : len / 2 + 1;

    // 比较
    int flag = 1;
    char temp;
    for (i = start; i < len; i++) {
        Pop(&S, &temp);
        if (temp != str[i]) {
            flag = 0;
            break;
        }
    }

    // 输出(严格大写 Y/N)
    if (flag)
        printf("Yes\n");
    else
        printf("No\n");

    return 0;
}