zoukankan      html  css  js  c++  java
  • 线性表的链式存储实现

    #include <stdio.h>
    #include <stdlib.h>
    
    /* 下面的单链表是带头节点的 */
    typedef int elementType;
    
    struct listNode {
        elementType data;
        struct listNode *next;
    };
    typedef struct listNode list;
    
    // 函数声明
    int insert (list *tmp, elementType x, int pos);
    void print (list *tmp);
    int getLength (list *tmp);
    int delete (list *tmp, int pos);
    
    int main () {
        int i;
        list *head = (list*)malloc(sizeof(list));
        head->next = NULL;
    
        // 循环插入测试数
        for (i=1; i<=10; i++) {
            insert(head, i+2, 1);
        }
        print(head);
    
    
        insert(head, 999, 11);
        print(head);
    
        delete(head, 1); //删除第1个节点
        printf("删除节点后的效果
    ");
        print(head);
    
        return 0;
    }
    
    // 插入
    // 参数说明: 要插入的链表 插入值 插入位置
    // pos的合法取值范围是 [1, length+1]
    // 取值为1代表插入到第1个节点之前, 取值为length+1代表插入到表尾
    int insert (list *tmp, elementType x, int pos) {
        list *ptr; // 存取指针
        list *cur; // 存放新节点
        int count = 1; // 计数
    
        int length = getLength(tmp);
        if (pos < 1 || pos > length + 1) {
            printf("插入位置错误
    ");
            return -1;
        }
    
        ptr = tmp; // ptr指向头结点
        while (count < pos) {
            ptr = ptr->next; // 循环结束后ptr指向 pos-1 节点
            count++;
        }
        cur = (list*)malloc(sizeof(list));
        cur->data = x;
        cur->next = ptr->next;
        ptr->next = cur;
        return 0;
    }
    
    // 得到链表的长度
    int getLength (list *tmp) {
        int length = 0;
        tmp = tmp->next;
        while (tmp != NULL) {
            length++;
            tmp = tmp->next;
        }
        return length;
    }
    
    // 循环打印输出链表信息
    void print (list *tmp) {
        list *head = tmp;
        tmp = tmp->next;
        printf("链表长度为: %d
    ", getLength(head));
        printf("链表中的数据:
    ");
        while (tmp != NULL) {
            printf("%d	", tmp->data);
            tmp = tmp->next;
        }
        printf("
    ");
        printf("
    ");
    }
    
    // 删除
    // 删除给定位置上的节点
    int delete (list *tmp, int pos) {
        int length = getLength(tmp);
        if (pos < 1 || pos > length) {
            printf("删除位置错误
    ");
            return -1;
        }
    
        int count = 1;
        list *ptr;
        list *posCur; // 存放要删除节点的指针
        ptr = tmp;
        // 找到 pos-1 这个节点
        while (count < pos) {
            ptr = ptr->next;
            count++;
        }
        // 循环结束后 ptr 指向 pos-1 这个节点
        posCur = ptr->next;
        ptr->next = posCur->next;
        free(posCur);
        return 0;
    }
    
    
    
    
    
    
  • 相关阅读:
    TcpClient连接帮助类
    winform中添加管理员权限控制
    textbox中输入email做格式控制
    绑定和非绑定方法
    类的封装、property、多态和多态性
    继承类之点点滴滴
    爬虫日记-正则表达式
    爬虫日记-单元总结
    爬虫日记-最好大学排名实例
    爬虫日记-第一单元总结
  • 原文地址:https://www.cnblogs.com/asheng2016/p/7605720.html
Copyright © 2011-2022 走看看