美文网首页
1.2 链表

1.2 链表

作者: 瓜尔佳Anthony | 来源:发表于2019-01-30 21:20 被阅读0次

    链表,别名链式存储结构或单链表,用于存储逻辑关系为 "一对一" 的数据。与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。

    链表的创建及增删改查

    #include "stdafx.h"
    
    typedef struct Link {
        char elem;
        struct Link * next; 
    }link;
    
    link * initLink() {
        //link * p = NULL; //头指针
        //link * temp = (link*)malloc(sizeof(link)); //临时节点
        link * p = (link*)malloc(sizeof(link));// 头节点用于遍历
        link *temp = p;
    
        for (int i = 1; i < 5; i++) {
            link * a = (link*)malloc(sizeof(link));
            a->elem = i*2;
            a->next = NULL;
            temp->next = a; //临时节点(前驱)指向 a(后继),存储 a 的位置
            temp = temp->next; //临时节点向后移一位
        }
        return p;
    }
    
    void display(link *p) {
        link *temp = p->next;
        while (temp) {
            printf("%d ", temp->elem);
            temp = temp->next;
        }
        printf("\n");
    }
    
    link * insertElem(link * p, int elem, int add) {
        link * temp = p;
        for (int i = 1; i < add; i++) {
            if (temp == NULL) {
                printf("Invalid address for inserting\n");
                return p;
            }
            temp = temp->next;
        }
        link *c = (link*)malloc(sizeof(link));
        c->elem = elem;
        c->next = temp->next;
        temp->next = c;
        return p;
        
    }
    
    link * delElem(link* p, int add) {
        link *temp = p;
        for (int i = 1; i < add; i++) {
            if (temp == NULL) {
                printf("Invalid address for deleting\n");
                return p;
            }
            temp = temp->next;
        }
        link * del = temp->next;
        temp->next = temp->next->next;
        free(del);//释放内存
        return p;
    }
    
    link * updateElem(link *p, int add, int newElem) {
        link * temp = p->next;
        for (int i = 1; i < add; i++) {
            if (temp == NULL) {
                printf("Invalid address for updating\n");
                return p;
            }
            temp = temp->next;
        }
        temp->elem = newElem;
        return p;
    }
    
    int selectElem(link * p, int elem) {
        link * temp = p->next;
        int i = 1;
        while (temp) {
            if (temp->elem == elem)
                return i;
            temp = temp->next;
            i++;
        }
        return -1;
    }
    
    int main() {
        printf("初始化链表为:\n");
        link *p = initLink();
        display(p);
    
        printf("在位置3前插入元素5\n");
        insertElem(p, 5, 3);
        display(p);
    
        printf("删除位置3的元素\n");
        delElem(p, 3);
        display(p);
    
        printf("查找元素6所在位置\n");
        printf("%d \n", selectElem(p, 6));
        
        printf("将位置3的元素改为10\n");
        updateElem(p, 3, 10);
        display(p);
    
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:1.2 链表

          本文链接:https://www.haomeiwen.com/subject/joqhsqtx.html