acm算法基础

本文深入探讨ACM算法的基础,重点围绕数据结构中的单链表进行讲解,包括二级目录和三级目录的详细内容。讨论了波兰式、出栈序列判定、后缀表达式以及顺序表的相关算法,同时涉及字符串处理,如KMP算法,并提供text1测试代码。
摘要由CSDN通过智能技术生成

数据结构

单链表

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
typedef int ElemType;
struct node
{
   
    ElemType data;
    node *next;
    node(int x = 0) : data(x), next(NULL) {
   }
};

typedef struct node List;
typedef struct node *Plist;

void createlist(node *&L, int n)
{
   
    node *s, *p;
    L = new (node);
    p = L;
    p->next = NULL;
    for (int i = 0; i < n; i++)
    {
   
        int a;
        scanf("%d", &a);
        s = new (node);
        s->data = a;
        s->next = p->next;
        p->next = s;
        //p=p->next;//加上此句尾插法,不加此句头插法;
    }
}

int LengthList(node *&head) //计算链表长度
{
   
    int cnt = 0;
    Plist p;
    p = head->next;
    while (p)
    {
   
        cnt++;
        p = p->next;
    }
    return cnt;
}

void printlist(node *&L) //输出链表
{
   
    node *r;
    r = L->next;
    while (r)
    {
   
        printf("%d ", r->data);
        r = r->next;
    }
    cout << endl;
}
void ChangeList(node *&L) //逆置链表
{
   
    node *p, *s, *chead;
    chead = new node;
    chead->next = NULL;
    p = L->next;
    while (p)
    {
   
        s = new node;
        s->next = NULL;
        s->data = p->data;
        s->next = chead->next;
        chead->next = s;
        p = p->next;
    }
    L = chead;
}
void DeleteList(node *&L) //删除重复元素
{
   
    node *p, *q, *r;
    p = L->next;
    while (p)
    {
   
        q = p->next;
        r = p;
        while (q)
        {
   
            if (p->data == q->data)
            {
   
                r->next = q->next;
                delete q;
            }
            else
            {
   
                r = r->next;
            }
            q = r->next;
        }
        p = p->next;
    }
}
void ListData(node *&r, int m) //删除链表中数值为m的节点
{
   
    node *p, *q;
    p = r->next;
    q = r;
    while (p)
    {
   
        if (p->data == m)
        {
   
            q->next = p->next;
            delete p;
            p = q->next;
        }
        else
        {
   
            p = p->next;
            q = q->next;
        }
    }
}
void MergeList(node *&A, node *&B, node *&C) //归并有序链表A和B
{
   
    node *p, *q, *r, *s;
    p = A->next;
    q = B->next;
    r = C;
    while (p && q)
    {
   
        if (p->data < q->data)
        {
   
            r->next = p;
            r = p;
            p = p->next;
        }
        else
        {
   
            r->next = q;
            r = q;
            q = q->next;
        }
    }
    if (p)
        r->next = p;
    else
        r->next = q;
}

void Chaifen(node *&head, node *&B, node *&C)
{
   
    node *r, *p, *q;
    r = head->next;
    p = B;
    q = C;
    while (r)
    {
   
        if (r->data % 2)
        {
   
            p->next = r;
            p = p->next;
            r = r->next;
        }
        else
        {
   
            q->next = r;
            q = q->next;
            r = r->next;
        }
    }
    p->next = NULL; //结束标志
    q->next = NULL; //结束标志
}
void sort(struct node *head) //冒泡排序
{
   
    node *p, *q;
    int t;
    for (p = head->next; p != NULL; p = p->next)
    {
   
        for (q = p->next; q != NULL; q = q->next)
        {
   
            if (p->data > q->data)
            {
   
                t = p->data;
                p->data = q->data;
                q->data = t;
            }
        }
    }
}
int main()
{
   
    int n;
    List *phead, *B, *C;
    scanf("%d", &n);
    createlist(phead, n);
    /*
    //createlist(B,n);
    //C=new node;
    // C->next=NULL;
    //MergeList(phead,B,C); 
    //createlist(phead);
    //ChangeList(phead);
    B=new node;
    B->next=NULL;
    C=new node;
    C->next=NULL;
    Chaifen(phead,B,C);
    cout<<LengthList(C)<<" "<<LengthList(B)<<endl;
    printlist(C);
    printlist(B);
    */
    //sort(phead);
    cout << LengthList(phead) << endl;
    printlist(phead);
    DeleteList(phead);
    cout << LengthList(phead) << endl;
    printlist(phead);
    return 0;
}

二级目录

三级目录

二级目录

三级目录

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
typedef int ElemType;
struct node
{
   
    ElemType data;
    node *next;
    node(int x = 0) : data(x), next(NULL) {
   }
};

typedef struct node List;
typedef struct node *Plist;

void createlist(node *&L, int n)
{
   
    node *s, *p;
    L = new (node);
    p = L;
    p->next = NULL;
    for (int i = 0; i < n; i++)
    {
   
        int a;
        scanf("%d", &a);
        s = new (node);
        s->data = a;
        s->next = p->next;
        p->next = s;
        //p=p->next;//加上此句尾插法,不加此句头插法;
    }
}

int LengthList(node *&head) //计算链表长度
{
   
    int cnt = 0;
    Plist p;
    p = head->next;
    while (p)
    {
   
        cnt++;
        p = p->next;
    }
    return cnt;
}

void printlist(node *&L) //输出链表
{
   
    node *r;
    r = L->next;
    while (r)
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值