BUAA数据结构期中考试 复习笔记

仔细看填空题空的结尾有没有“;”

关注“循环”、“单/双链表”

表达式计算

    gets(s);
    ls = strlen(s);
    while (1)
    { // read a number and read a operator
        x = get_num();
        // if "*"、"/" then calculate at once
        /* 5 - 1 * 2 */
        if (stack_fuh[top_fuh] == 3)
            stack_num[top_num] *= x, top_fuh--;
        else if (stack_fuh[top_fuh] == 4)
            stack_num[top_num] /= x, top_fuh--;
        else // save it
            stack_num[++top_num] = x;
        x = get_fuh();
        if (x == 5)
            break;
        stack_fuh[++top_fuh] = x;
    }
    // calculate "+"、"-"
    while (top_num > 1)
    {
        if (stack_fuh[top_fuh] == 1)
            ans += stack_num[top_num];
        else if (stack_fuh[top_fuh] == 2)
            ans -= stack_num[top_num];
        top_num--;
        top_fuh--;
    }
    ans += stack_num[top_num];
    printf("%d\n", ans);

文件输入输出

    FILE *in;
    FILE *out;

    // char cwd[1024];
    // if (getcwd(cwd, sizeof(cwd)) != NULL)
    // {
    //     printf("Current working dir: %s\n", cwd);
    // }
    // else
    // {
    //     perror("getcwd() error");
    //     return 1;
    // }

    in = fopen("in.txt", "r");
    out = fopen("out.txt", "w");
	
    scanf("%s", a);
    while (fgets(s, 1010, in) != NULL)
	{
    	fprintf(out, "%c", s[i]);
	}

    fclose(in);
    fclose(out);

C语言排序

struct peo
{
    char name[25];
    long long number;
    int plc;
} book[1010];
int cmp(const void *a, const void *b)
{
    struct peo *p1 = (struct peo *)a;
    struct peo *p2 = (struct peo *)b;
    int x = strcmp(p1->name, p2->name);
    if (x == 0)
        return p1->plc - p2->plc;
    else
        return x;
}
    qsort(&book[1], n, sizeof(book[0]), cmp);
//! is wrong
    if (xx->num == yy->num)
        return xx->plc < yy->plc;
    else
        return xx->num > yy->num;
//you should
    if (xx->num == yy->num)
        return yy->plc - xx->plc;
    else
        return xx->num - yy->num;

对齐输出

printf("%-50s%-20s%-30s%-10lld\n",/*...*/);

链表

ptr = (struct node *)malloc(sizeof(struct node));
//memory里面有加点,构建循环链表,遍历
//encode里面有删点

可见字符

char zif[] = {" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"};

中缀表达式转换为后缀表达式

中缀表达式转换为后缀表达式(逆波兰表达式)的过程可以借助栈来实现。具体步骤如下:

转换步骤
  1. 初始化两个栈:一个用于存放运算符(operator_stack),另一个用于存储后缀表达式(output)。

  2. 从左到右扫描中缀表达式

    • 操作数:直接压入output

    • 左括号:压入operator_stack

    • 右括号:弹出operator_stack中的运算符并压入output,直到遇到左括号,然后丢弃左括号。

    • 运算符

      • operator_stack为空或栈顶为左括号,直接压入。

      • 否则,比较当前运算符与栈顶运算符的优先级:

        • 若当前运算符优先级高于栈顶运算符,压入。
        • 否则,弹出栈顶运算符并压入output,直到满足压入条件。
  3. 扫描结束后:将operator_stack中剩余的运算符依次弹出并压入output

示例

中缀表达式:3 + 4 * 2 / ( 1 - 5 ) → 后缀表达式:3 4 2 * 1 5 - / +

优先级规则

  • ^(幂运算):最高优先级,右结合。
  • */:次高优先级,左结合。
  • +-:最低优先级,左结合。
  • 初等量运算符()、[]、->高于单目运算符*、++、–

函数指针、指针函数、函数指针数组

  1. int *fpi();

    • 分析:fpi 先与 () 结合,表明它是一个函数。函数返回值为 int *(指向整型的指针)。
    • 结论:这是一个指针函数,即返回指针的函数。
  2. int (*pfi)();

    • 分析:(*pfi) 被括号包裹,pfi 是一个指针,指向一个无参数、返回值为 int 的函数。
    • 结论:这是一个 函数指针,用于指向特定类型的函数。
  3. void (*func[] )();

    • 分析:func 是数组([] 优先级高于 *),数组元素是指针,每个指针指向无参数、返回值为 void 的函数。
    • 结论:这是一个函数指针数组,数组元素均为指向特定类型函数的指针。

通过优先级和结合性分析,可清晰区分三者:指针函数是“函数返回指针”,函数指针是“指针指向函数”,函数指针数组是“数组元素为函数指针”。

malloc

s = (char *)malloc(strlen(p)+1);/* s指向能正好存放字符串p的空间*/

结构体

struct 结构类型名
{
	成员类型   成员名;
	…
};
1)无结构名
struct {} s1, s2;
一般适用于说明本地变量。
2)有结构名
struct date {} ;
struct date s1, s2;
通常用来说明外部结构变量,或需要在多个函数中用到的相同的结构的变量。
3)使用typedef
typedef struct {} DATE;
则变量定义为:DATE d, *pd, ad[10];
使用typedef定义结构类型名后,结构变量的定义(或说明)就更简洁了。

线性表

线性关系

数据元素之间的先后顺序为“一对一”的关系。

线性表的定义

数据元素之间具有的逻辑关系为线性关系的数据元素集合称为线性表,数据元素的个数n为线性表的长度,长度为0的线性表称为空表

线性表的特点

(1)同一性 (2)有穷性 (3)有序性

  • 同一性:线性表中的数据元素必须属于同一数据对象,即具有相同的数据类型。例如,一个整数型线性表中,所有元素都只能是整数,不能混合字符、浮点数等其他类型数据,保证了元素在存储结构和操作方式上的一致性。
  • 有穷性:线性表由有限个数据元素组成,表的长度 n 是一个确定的自然数(\(n \geq 0\))。当 \(n = 0\) 时为空表,这与无限序列有本质区别,无论表中元素多少,其个数始终是有限且可确定的。
  • 有序性:线性表中的元素存在明确的逻辑顺序,除第一个元素外,每个元素有且仅有一个直接前驱;除最后一个元素外,每个元素有且仅有一个直接后继。相邻数据元素间存在序偶关系 \(<a_i, a_{i+1}>\),体现了 “一对一” 的线性关系,如序列 \((a_1, a_2, \dots, a_n)\) 中,\(a_i\) 在 \(a_{i-1}\) 之后、\(a_{i+1}\) 之前,位置不可随意调换。

线性链表 单链表 单向链表

顺序存储结构、链式存储结构、索引结构和散列结构

  1. 顺序存储结构将数据元素按照逻辑顺序依次存放在一块连续的存储空间中,逻辑上相邻的元素在物理位置上也相邻。例如数组,可通过下标快速随机访问元素。优点是存取速度快,缺点是插入和删除操作需移动大量元素,且需预先确定空间大小,灵活性较差。
  2. 链式存储结构通过指针将数据元素连接起来,元素的存储位置可以不连续。每个元素(节点)包含数据域和指针域,通过指针指向下一个元素。例如链表,插入和删除操作只需修改指针,无需移动其他元素。优点是动态操作灵活,无需预先分配固定空间;缺点是无法随机访问,需从表头遍历查找,且指针占用额外空间,存储密度较低。
  3. 索引结构除存储数据本身外,还建立一个索引表,索引表中包含关键字及其对应数据元素的存储地址(或位置)。访问数据时先查索引表,再根据地址定位数据。优点是检索速度快,能解决链式存储查找慢的问题;缺点是索引表占用额外存储空间,且维护索引表需额外操作。
  4. 散列结构(哈希存储) 利用散列函数(哈希函数)将数据元素的关键字映射到固定的存储位置。例如哈希表,理想情况下可在常数时间( \(O(1)\) )内完成插入、删除和查找操作。优点是查找效率高;缺点是可能出现哈希冲突(不同关键字映射到同一位置),需通过开放定址法、链地址法等处理冲突,且散列函数设计不当可能影响性能。

线性表是一种逻辑结构,描述数据元素间 “一对一” 的线性关系。它与数组、链表及四种存储结构的关系如下:

1. 线性表与数组、链表的关系

  • 数组:是一种顺序存储结构(物理结构),可用于实现线性表(即顺序表)。此时,线性表的元素在物理存储上连续,可通过下标随机访问元素,但插入、删除操作可能需移动大量元素。
  • 链表:是一种链式存储结构(物理结构),也可用于实现线性表。链表元素存储位置可不连续,通过指针链接,插入、删除操作灵活,但无法随机访问,需遍历查找。

2. 线性表与四种存储结构的关系

  • 顺序存储结构:线性表采用顺序存储时,即通过数组实现,称为顺序表。逻辑相邻的元素在物理存储上也相邻。
  • 链式存储结构:线性表采用链式存储时,即通过链表实现,元素存储位置可离散,逻辑关系由指针维护。
  • 索引结构:可用于优化线性表的查找操作。为线性表建立索引表,通过关键字快速定位元素存储位置,提升检索效率(如分块查找)。
  • 散列结构:利用散列函数将线性表元素的关键字映射到存储位置,理想情况下可实现 \(O(1)\) 时间复杂度的插入、删除和查找(如哈希表实现的线性表)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值