数据结构

数据结构

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。常见的数据结构如下:

队列

队列是一种特殊的线性结构,它只允许在队列的首部进行删除操作,这成为“出队”,而在队列的尾部进行插入操作,这称为“入队”。当队列中的中没有元素时,称为空队列。队列遵循先进先出原则(First In First Out FIFO)

队列的三个基本元素(一个数组,两个变量)

将这些元素封装成一个结构体类型

typedef struct {
    int data[100];
    int head;
    int tail;
}queue;

    queue a;
    a.head = 1;
    a.tail = 1;
    for (int i = 1; i <= 9; i++) {
        //依次向队列插入9个数
        scanf("%d",&a.data[a.tail]);
        a.tail++;
    }
    while (a.head < a.tail) {
        //打印队首并将队首出队
        printf("%d ",a.data[a.head]);
        a.head++;

        //先将新队首的数添加到队尾
        a.data[a.tail] = a.data[a.head];
        a.tail++;
        a.head++;
    }

栈是一种先进先出的数据结构,它限定只能在一段进行插入和删除操作。栈的实现很简单,只需要一个数组和一个指向栈顶得变量top就可以了,我们通过top来进行插入和删除操作。

    char a[101],s[101];
    int i,len,mid,next,top;

    gets(a);//读入一行字符串
    len = strlen(a);//求字符串的长度
    mid = len/2-1;//求字符串的中点

    top = 0;
    //将mid之前的字符依次入栈
    for (int i = 1; i <= mid; i++) {
        s[++top] = a[i];
    }

    //判断字符串的长度是奇数还是偶数,并找出需要进行字符匹配的起始下标
    if(len % 2 == 0){
        next = mid+1;
    }else{
        next = mid+2;
    }

    //开始匹配
    for (int i = next; i <= len-1; i++) {
        if (a[i]!=s[top]) {
            break;
        }
        top--;
    }

    //如果top的值为0,则说明栈内所有的字符都被一一匹配了
    if(top == 0){
        printf("YES");
    }else{
        printf("NO");
    }

链表

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。

    struct node *head,*p,*q = NULL,*t;
    int i,n,a;
    scanf("%d",&n);
    head = NULL;
    for (i = 1; i <= n; i++) {
        scanf("%d",&a);
        p = (struct node *)malloc(sizeof(struct node));
        p->data = a;
        p->next = NULL;
        if (head == NULL) {
            head = p;
        }else{
            q->next = p;
        }
        q = p;
    }

    t = head;
    while (t != NULL) {
        printf("%d ",t->data);
        t = t->next;
    }


    return 0;

在链表中插入

    while (t != NULL) {
        if (t->next == NULL || t->next->data > a) {
            p = (struct node*)malloc(sizeof(struct node));
            p->data = a;
            p->next = t->next;
            t->next = p;
            break;
        }
        t = t->next;
    }

模拟链表

每个链表结点由两部分组成,一是本身的数据,二是他之后的数,我们之前用结构体来表示这个结点,在这里我们也可以用两个数组表示。思路:数组A表示每个序列中的数字,数组B则表示对应的的下一个结点的在数组A中的位置。

具体代码实现:

    int data[101],ringt[101];
    int i,n,t,len;
    //读入已有的数字
    scanf("%d",&n);
    for (i = 1 ; i <= n; i++) {
        scanf("%d",&data[i]);
    }
    len = n;
    //初始化数组right
    for (i = 1; i <= n; i++) {
        if (i!=n) {
            ringt[i] = i+1;
        }else{
            ringt[i] = 0;
        }
    }

    //直接在数组data的末尾增加一个数字
    len++;
    scanf("%d",&data[len]);

    //从链表的头部开始遍历
    t = 1;
    while (t != 0) {
        if (data[ringt[t]] > data[len]) {//如果当前结点下一个结点的值大于待插入的数,将数插入到中间
            ringt[len] = ringt[t];//新插入数的下一个结点标号等于当前结点的下一个标号
            ringt[t] = len;//当前结点的下一个结点编号就是新插入的书的编号
            break;//插入完成跳出循环
        }
        t = ringt[t];
    }

    //遍历链表
    t = 1;
    while (t!= 0) {
        printf("%d ",data[t]);
        t = ringt[t];
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值