九、链表

链表

1. 因为数组是静态分配存储空间,以后不能修改,链表是动态
2. 链表分为数据域和指针域

定义结构体

1. 不能这样定义,因为此时在{}内部还没有NODE
typedef {
    char name[10];
    int num;
    NODE *next;
} NODE;
2. 无法在定义结构体时赋初值,不起作用
struct Node{
    char name[10] = {0};
    int num;
    struct Node *next = NULL;
};
typedef struct Node NODE;

创建结点

NODE *createNode(char *_name, int *_num) {
    NODE *temp = (NODE *)malloc(sizeof(NODE));
    memcpy(temp->name, _name, strlen(_name)+1);
    temp->num = *_num;
    temp->next = NULL;
    return temp;
}

删除结点

void deleteNode(NODE *p) {
    if(NULL != p) {
        free( p );
        p = NULL;
    }
}

末尾追加结点

void append(NODE **head, char *_name, int _num) {
    NODE *temp = createNode(_name, &_num);
    NODE *p = *head; //当前结点
    NODE *pf = *head; //上一个结点
    // 不能用p
    if(NULL == *head) {
        *head = temp;
    } else {
        while (p != NULL) {
            pf = p;
            p = p->next;
        }
        pf->next = temp;
    }
}

删除指定结点

void deleteSomeNode(NODE **head, char *_name) {
    NODE *temp;
    NODE *p = *head;
    NODE *pf = *head;
    if(NULL == p) {
        return;
    }
    while( p ) {
        // 找到结点
        if(0 == strcmp(p->name, _name)) {
            temp = p;
            // 在第一个
            if(p == *head) {
                *head = p->next;
                p = *head;
                pf = *head;
            // 在最后一个
            } else if(p->next == NULL) {
                pf->next = NULL;
                p = NULL;
            // 在中间
            } else {
                pf->next = p->next;
                p = pf->next;
            }
            deleteNode(temp);
        } else {
            pf = p;
            p = p->next;
        }
     }
}

打印输出

void printfNode(NODE *head) {
    NODE *p = head;
    while ( p ) {
        printf("%s ", p->name);
        p = p->next;
    }
    printf("\n");
}

插入

void insert(NODE **head, char *_name, int _num, char *someone) {
    NODE *temp = createNode(_name, &_num);
    NODE *p = *head;
    NODE *pf = *head;
    // 不能用p
    if(NULL == *head) {
        *head = temp;
    } else {
        while (p != NULL) {
            if(0 == strcmp(p->name, someone)) {
                pf->next = temp;
                temp->next = p;
                return;
            } else {
                pf = p;
                p = p->next;
            }
         }
        pf->next = temp;
    }
}


int main(int argc, char *argv[])
{
    NODE *head = NULL;
    printf("*** appent ***\n");
    append(&head, "1", 100);
    append(&head, "2", 200);
    append(&head, "3", 300);
    append(&head, "4", 400);
    printfNode(head);

    printf("*** delete ***\n");
    deleteSomeNode(&head, "1");
    printfNode(head);
    deleteSomeNode(&head, "3");
    printfNode(head);
    deleteSomeNode(&head, "4");
    printfNode(head);

    printf("*** insert ***\n");
    insert(&head, "4", 400, "2");
    printfNode(head);
    insert(&head, "3", 300, "2");
    printfNode(head);
    insert(&head, "100", 100, "2");
    printfNode(head);

    deleteSomeNode(head, "3");
    deleteSomeNode(head, "4");
    printfNode(head);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值