c语言实现数据结构

这里是记录一下自己的学习过程

完整代码在我的 gitee 仓库中

第一章

第二章

1  线性表

        1.1  数组(顺序表)
        1.2  链表

                (1)定义节点

                

//定义结点类型
typedef struct Node {
    int data;           //数据类型,你可以把int型的data换成任意数据类型,包括结构体struct等复合类型
    struct Node* next;          //单链表的指针域
} Node, * LinkedList;

                (2) 初始化

//单链表的初始化
LinkedList LinkedListInit() {
    Node* L;
    L = (Node*)malloc(sizeof(Node));   //申请结点空间
    if (L == NULL) {    //判断申请空间是否失败
        exit(0);    //如果失败则退出程序
    }
    return L;
}

                (3) 创建链表

                        头插法

//单链表的建立1,头插法建立单链表
LinkedList LinkedListCreatH() {
    Node* L;
    L = (Node*)malloc(sizeof(Node));   //申请头结点空间
    L->next = NULL;                      //初始化一个空链表

    int x;                         //x为链表数据域中的数据

    printf("头插法建立链表\n");
    printf("请输入:");
    while (scanf("%d", &x) != EOF) {
        Node* p;
        p = (Node*)malloc(sizeof(Node));   //申请新的结点
        p->data = x;                     //结点数据域赋值
        p->next = L->next;            //将结点插入到表头L-->|2|-->|1|-->NULL
        L->next = p;
        printf("请输入:");
    }
    return L;
}

                        尾插法

//尾插法建立链表
LinkedList LinkedListCreatE() {
    LinkedList L;
    L = LinkedListInit();
    
    LinkedList r = L;
    int x;
    
    printf("尾插法建立链表\n");
    printf("请输入:");
    while (scanf("%d",&x) != EOF)
    {
        Node* p;
        p = LinkedListInit();
        p->data = x;
        p->next = NULL;
        r->next = p;
        r = p;
        printf("请输入:");
    }
    return L;
}

                (4)遍历

//遍历链表
void LinkedListErgodic(LinkedList L) {
    LinkedList p;
    p = L;
    int i = 1;

    printf("开始遍历链表--------------------\n");
    while (p->next != NULL) {
        printf("第%d个链表数据为: %d \n",i, p->next->data);
        p = p->next;
        i++;
    };
    return;
}

                (5) 插入

/*
L           插入的链表
local       插入的位置(下标,从0开始)
data_n      插入的数据

retune      指向插入元素的结点指针
*/
Node* LinkedListInster(LinkedList L, int local,int data_n) {
    printf("开始插入--------------------\n");
    Node* r = L;
    int i = 0;
    //printf("插入\n");
    //printf("位置%d\n",local);
    //printf("数据%d\n",data_n);
    while (i <local)
    {
        r = r->next;
        i++;
    }
    Node* p = LinkedListInit();
    p->data = data_n;
    p->next = r->next;
    r->next = p;
        
    return p;
}

                (6) 删除

/*
L           操作的链表
local       删除插入的位置(下标,从0开始)

retune      链表

删除方法:按照下标进行删除(按位置删除的没写)
*/
Node* LinkedListDelete(LinkedList L, int local){
    printf("开始删除--------------------\n");
    int i = 0;
    Node* pre;
    Node* p;
    pre = L;

    while (i < local)
    {
        pre = pre->next;
        i++;
    }
    p = pre->next;
    //printf("pre数据: %d", pre->data);
    //printf("p数据: %d", p->data);

    pre->next = p->next;
    p->next = NULL;
    free(p);

    return L;
}

                       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值