• C语言实现常用数据结构——链表


    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct Node {
        int data;
        struct Node *next;
    } node;
    
    /*初始化链表:
    1.首先给头指针分配空间,将头指针赋给temp
    2.其次给每一个元素分配空间
    3.将内容赋给当前节点的data,NULL赋给当前节点的next指针
    4.把当前节点赋给(头指针)上一个节点的next指针
    5.上一节点指针后移,准备初始化下个元素
    6.最后返回当前链表的头指针*/
    node *initnode() {
        int i;
        node *p = (node*)malloc(sizeof(node));
        node *temp = p;
        for (i = 0; i < 10; i++) {
            node *a = (node*)malloc(sizeof(node));
            a->data = i;
            a->next = NULL;
            temp->next = a;
            temp = temp->next;
        }
        return p;
    }
    
    /*指定位置插入元素:
    1.将头指针赋给temp
    2.temp一直遍历直到指定位置
    3.给需要插入的元素分配空间,并将内容赋给分配好空间的元素
    4.将插入位置的后一元素赋给要插入元素的next指针
    5.将插入元素赋给temp的next指针
    6.最后返回当前链表的头指针*/
    node *insertElem(node *p, int elem, int pos) {
        int i;
        node *temp = p;
        for ( i = 0; i < pos; i++) {
            temp = temp->next;
        }
        node *c = (node*)malloc(sizeof(node));
        c->data = elem;
        c->next = temp->next;
        temp->next = c;
        return p;
    }
    
    /*删除指定位置的元素:
    1.将头指针赋给temp
    2.temp一直遍历直到指定位置
    3.声明一个变量代表待删除节点
    4.将待删除节点的下一节点赋给待删除节点的上一节点的next指针
    5.释放待删除节点空间
    6.最后返回当前链表的头指针*/
    node *delElem(node *p, int pos) {
        int i;
        node *temp = p;
        for ( i = 0; i < pos; i++) {
            temp = temp->next;
        }
        node *c = temp->next;
        temp->next = c->next;
        free(c);
        return p;
    }
    
    /*查询指定元素的位置:
    1.将头指针赋给temp
    2.temp一直遍历直到temp节点的值等于要查询的元素
    3.返回当前节点的index
    4.如果链表遍历结束也未找到指定节点,返回-1
    */
    int selectElem(node *p, int elem) {
        node *temp = p;
        int i = 0;
        while (temp->next) {
            temp = temp->next;
            if (temp->data == elem) {
                return i;
            }
            i++;
        }
        return -1;
    }
    
    /*更新链表指定节点的值*/
    node *amendElem(node *p, int pos, int newElem) {
        int i;
        node *temp = p;
        for ( i = 0; i < pos; i++) {
            temp = temp->next;
        }
        node *amend = temp->next;
        amend->data = newElem;
        return p;
    }
    
    /*遍历链表*/
    void display(node *p) {
        node *temp = p;
        while (temp->next) {
            temp = temp->next;
            printf("%d ", temp->data);
        }
        printf("
    ");
    }
    
    //以下内容来自《数据结构与算法-C语言描述》
    int IsEmpty(node *p) {
        return p->next==NULL;
    }
    
    int IsLast(node *pos,node *p) {
        return pos->next==NULL;
    }
    
    //删除指定位置的元素
    node *Delete(node *p,int elem) {
        node *temp=p;
        node *tmp;
        while(temp->next) {
            if(temp->next->data==elem) {
                tmp=temp->next;
                temp->next=tmp->next;
                free(tmp);
            }
            temp=temp->next;
        }
        return p;
    }
    
    //在指定位置插入元素
    node *Insert(node *p,int pos,int elem) {
        node *temp=p;
        int i;
        for(i=0; i<pos; i++) {
            temp=temp->next;
        }
        node *cell =(node*)malloc(sizeof(node));
        cell->data=elem;
        cell->next=temp->next;
        temp->next=cell;
        return p;
    }
    //删除list
    void DeleteList(node *p) {
        node *temp=p;
        node *tmp;
        p->next=NULL;
        while(temp->next) {
            tmp=temp->next;
            free(tmp);
            temp=temp->next;
        }
    }
    
    
    int main() {
        node *p = initnode();
        display(p);
        printf("在第4的位置插入元素5:
    ");
        p = Insert(p, 4, 5);
        display(p);
        printf("删除第3个元素:
    ");
        p = delElem(p, 3);
        display(p);
        printf("查找元素2的位置为:
    ");
        int address = selectElem(p, 2);
        if (address == -1) {
            printf("没有该元素
    ");
        } else {
            printf("元素2的位子为:%d
    ", address);
        }
        printf("更改第3的位置的数为7:
    ");
        p = amendElem(p, 3, 7);
        display(p);
        printf("delete7
    ");
        p=Delete(p,7);
        display(p);
        printf("删除
    ");
        DeleteList(p);
        display(p);
    }
  • 相关阅读:
    Linux中断管理 (2)软中断和tasklet
    Linux中断管理 (1)Linux中断管理机制
    Linux中断管理
    Linux内核访问用户空间文件:get_fs()/set_fs()的使用
    Linux进程管理 (1)进程的诞生
    Linux进程管理专题
    Linux内存管理 (23)一个内存Oops解析
    Linux内存管理 (22)内存检测技术(slub_debug/kmemleak/kasan)
    Linux内存管理 (21)OOM
    Linux内存管理 (20)最新更新和展望
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/9593669.html
Copyright © 2020-2023  润新知