zoukankan      html  css  js  c++  java
  • 算法与数据结构

    1.顺序表

    手敲的代码:

    #include <stdio.h>
    #include <stdlib.h>
    typedef struct table{
        int *pBase;
        int length;
        int cnt;
        }Student;
    //Student p1;
    init_arr(Student *p,int length){
        p->pBase=(int *)malloc(sizeof(int)*length);
        p->length=length;
        p->cnt=0;}
    append_arr(Student *p,int val){
        p->pBase[p->cnt]=val;
        p->cnt++;
        }
    insert_arr(Student *p,int pos,int val){
        //在第pos位置插入值
        int i;
        for(i=0;i<p->cnt;i++){
            printf("插入前:%d
    ",p->pBase[i]);
        }
        for(i=p->cnt-1;i>=pos-1;i--){
            p->pBase[i+1]=p->pBase[i];
        }
        p->pBase[pos-1]=val;
        p->cnt++;
        for(i=0;i<p->cnt;i++){
            printf("插入后:%d
    ",p->pBase[i]);
        }
    }
    delete_arr(Student *p,int pos){
        //删除第pos个位置的值
        int i;
        for(i=pos-1;i<=p->cnt-1;i++){
            p->pBase[i]=p->pBase[i+1];
        }
        p->cnt--;
        for(i=0;i<p->cnt;i++){
            printf("删除后:%d
    ",p->pBase[i]);
        }
    }
    
    int main()
    {
        Student *p1;
        init_arr(&p1,10);
        append_arr(&p1,2);
        append_arr(&p1,3);
        append_arr(&p1,8);
        insert_arr(&p1,2,67);
        delete_arr(&p1,3);
        return 0;
    }

    顺序表的操作,包括初始化、增加元素、插入元素和删除元素。

    结构体Student包含三个成员变量,分别是数组首地址、总长度和有效长度

    由于顺序表以数组形式存储元素,所以使用数组的表达式(a[0]之类的)很容易完成

    运行结果:

    2.单链表

    1.尾插法创建链表(尾插法是顺序插入的,方法是一开始将尾指针指向头指针,每次插入新元素,就将尾指针指向新元素,并设置尾指针的next为NULL)

    手敲的代码:

    #include <stdio.h>
    #include <stdlib.h>
    typedef struct NODE{
        int data;
        struct NODE *Next;
    }NODE,*PNODE;
    PNODE create_list(){
        //尾插法
        int len;
        PNODE pNew;
        PNODE pHead = (PNODE)malloc(sizeof(NODE));
        PNODE pTail=pHead;
        printf("请输入len:
    ");
        scanf("%d",&len);
        int i=0,data;
        for(i=0;i<len;i++){
            printf("请输入第%d位的data:
    ",i);
            scanf("%d",&data);
            PNODE pNew=(PNODE)malloc(sizeof(NODE));
            pNew->data=data;
            pTail->Next=pNew;
            pTail=pNew;
            pNew->Next=NULL;
        }
        return pHead;}
    //删除 delete_list(PNODE p,
    int pos){ int i; for(i=0;i<pos-1;i++){ p=p->Next; } p->Next=p->Next->Next; }
    //插入 insert_list(PNODE p,
    int pos,int val){ int i; for(i=0;i<pos-1;i++){ p=p->Next; } PNODE pNew; pNew=(PNODE)malloc(sizeof(NODE)); pNew->data=val; pNew->Next=p->Next; p->Next=pNew; }
    //遍历 travel_list(PNODE p){
    while(p->Next!=NULL){ p=p->Next; printf("值:%d ",p->data); } } int main() { PNODE pHead; pHead=create_list(); delete_list(pHead,3); insert_list(pHead,4,66); travel_list(pHead); }

    结果:

    2.头插法创建链表

    因为头插法是逆向插入,且不需要尾指针,全靠头指针插入,使用遍历时会发现元素是反着打印的

    头插法的特点是头指针的next设为NULL,之后将头指针next赋给新元素的next,最后头指针的next指向新元素

    手敲的代码:

    #include <stdio.h>
    #include <stdlib.h>
    typedef struct NODE{
        int data;
        struct NODE *Next;
    }NODE,*PNODE;
    PNODE create_list(){
        //头插法
        int len;
        PNODE pNew;
        PNODE pHead = (PNODE)malloc(sizeof(NODE));
        pHead->Next=NULL;
        printf("请输入len:
    ");
        scanf("%d",&len);
        int i=0,data;
        for(i=0;i<len;i++){
            printf("请输入第%d位的data:
    ",i);
            scanf("%d",&data);
            PNODE pNew=(PNODE)malloc(sizeof(NODE));
            pNew->data=data;
            pNew->Next=pHead->Next;
            pHead->Next=pNew;
        }
        return pHead;}
    delete_list(PNODE p,int pos){
        int i;
        for(i=0;i<pos-1;i++){
            p=p->Next;
        }
        p->Next=p->Next->Next;
        }
    insert_list(PNODE p,int pos,int val){
        int i;
        for(i=0;i<pos-1;i++){
            p=p->Next;
        }
        PNODE pNew;
        pNew=(PNODE)malloc(sizeof(NODE));
        pNew->data=val;
        pNew->Next=p->Next;
        p->Next=pNew;
    }
    travel_list(PNODE p){
        while(p->Next!=NULL){
            p=p->Next;
            printf("值:%d
    ",p->data);
        }
    }
    int main()
    {   PNODE pHead;
        pHead=create_list();
        delete_list(pHead,3);
        insert_list(pHead,4,66);
        travel_list(pHead);
    }

    结果:

  • 相关阅读:
    NTP网络对时器,GPS北斗对时装置—京准电子科技
    NTP网络授时,分布式系统时钟同步重要性-京准电子科技
    GPS时间同步服务器,北斗对时仪-京准电子科技
    北斗授时器(北斗卫星授时器)技术方案—京准电子科技
    CTF-练习平台-Misc之 MISC图穷匕见
    CTF-练习平台-Misc之 细心的大象
    CTF-练习平台-Misc之 Linux基础1
    CTF-练习平台-Misc之 想蹭网先接开密码
    CTF-练习平台-Misc之 再来一道隐写
    CTF-练习平台-Misc之 这么多数据包
  • 原文地址:https://www.cnblogs.com/echoDetected/p/13813522.html
Copyright © 2011-2022 走看看