• step3 . day2 数据结构之线性表链表


    今天继续学习数据结构的线性表部分,从基础的顺序表到链表,类比写了一些调用函数,完成了表的增删改查排序等问题。

    尤其是链表的排序,费了很大的心思终于捋顺写出来了,小有成就感,而且代码一次通过率越来越高,几乎不用修改就能测试通过了,make傲娇一小会。

    #include <stdio.h>
    #include <stdlib.h>

    //重定义数据类型名
    typedef int datetype;

    //链表结构体
    typedef struct linklist{
    datetype date;
    struct linklist *next;
    }linklist,*linklist_p;

    //链表头创建
    linklist_p linklist_creat(){

    linklist_p head = NULL;
    head = (linklist_p)malloc(sizeof(linklist)); //分配空间
    if(!head){
    printf("malloc failed ");
    return NULL;
    }

    // memset(&(head->date),0,sizeof(datetype)); //数据出初始化
    head->next = NULL;

    return head;
    }

    //头部插入
    void linklist_head_insert(linklist_p head,datetype value){
    linklist_p temp = NULL;
    temp = linklist_creat();
    temp->date = value;

    temp->next = head->next;
    head->next = temp;
    }


    //遍历链表
    void linklist_show(linklist_p head){

    while(head->next != NULL){
    printf("%d ",head->next->date);
    head = head->next;
    }
    puts("");
    }

    //尾部插入
    void linklist_tail_insert(linklist_p head,datetype value){
    linklist_p temp = NULL;
    temp = linklist_creat();
    temp->date = value;

    temp->next = NULL;
    while(head->next !=NULL){
    head = head->next;
    }
    head->next = temp;
    }


    //按照位置插入
    void linklist_pos_insert(linklist_p head,int pos,datetype value){
    linklist_p temp = NULL;
    temp = linklist_creat();
    temp->date = value;

    int i = 1;
    while(head->next !=NULL && i < pos){
    head = head->next;
    i++;
    }
    if(i == pos){
    temp->next = head->next;
    head->next = temp;
    }
    else
    printf("position illegal ");
    }

    //查找
    int linklist_search(linklist_p head,datetype value){
    int pos = 1;
    while(head->next != NULL){
    if(head->next->date == value){
    return pos;
    }
    pos++;
    head = head->next;
    }
    return -1;
    }
    //按值修改
    void linklist_value_update(linklist_p head,datetype old,datetype new){

    while(head->next != NULL){
    if(head->next->date == old){
    head->next->date = new;
    }
    head = head->next;
    }
    }

    //按位置修改
    void linklist_pos_update(linklist_p head,int pos,datetype value){

    int i=1;
    while(head->next != NULL && i<pos){
    head = head->next;
    i++;
    }
    if(i == pos && head->next !=NULL){
    head->next->date = value;
    }
    else{
    printf("can not find ");
    }
    }

    //判断是否为空表
    int linklist_is_empty(linklist_p head){

    return head->next == NULL? 1 : 0;
    }


    //头部删除
    datetype linklist_head_del(linklist_p head){
    if(linklist_is_empty(head)){
    printf("linklist is empty ");
    return -1;
    }
    int value = head->next->date;
    linklist_p temp = head->next;
    head->next = head->next->next;
    free(temp);
    temp =NULL;
    return value;

    }

    //尾部删除
    datetype linklist_tail_del(linklist_p head){

    while(head->next->next != NULL){
    head = head->next;
    }
    int value =head->next->date;
    linklist_p temp = head->next;
    head->next = NULL;
    free(temp);
    temp = NULL;
    return value;
    }

    //翻转输出
    void linklist_reversal(linklist_p head){
    linklist_p p,q;
    p = head->next;
    head->next =NULL;
    while(p != NULL){
    q = p;
    p = p->next;
    q->next = head->next;
    head->next = q;
    }
    }

    //链表清空
    void linklist_clear(linklist_p head){
    linklist_p p,q;
    p = head->next;
    head->next =NULL;
    while(p != NULL){
    q = p;
    p = p->next;
    free(q);
    q=NULL;
    }
    }

    //排序
    void linklist_sort(linklist_p head){
    linklist_p p,q,temp;
    //p为拆分后待排序链表头指针
    //q为排序完成呆释放数据元素
    //temp为排序完成最小数据元素比较值指针

    p = head->next->next;
    head->next->next = NULL; //拆分链表
    while(p != NULL){
    int pos = 1; //初始插入点
    linklist_p temp = head; //定位排序ok初始链表
    while(temp->next !=NULL){ //寻找插入点
    if(p->date < temp->next->date){
    linklist_pos_insert(head,pos,p->date);
    q = p;
    p = p->next;
    free(q);
    q = NULL;
    break;
    }
    else{//第一位未找到插入,位置后移,对比值后移
    pos++;
    temp = temp->next;
    }
    }

    if(temp->next == NULL){ //值大于所以已排序好链表数据元素
    linklist_tail_insert(head,p->date);
    q = p;
    p = p->next;
    free(q);
    q = NULL;
    }

    }

    }

    //删除重复数据
    void linklist_repeat_del(linklist_p head){
    linklist_p itemp = head->next;
    linklist_p jtemp = itemp->next;
    linklist_p p = NULL;

    while(jtemp){
    if(jtemp->date == itemp->date){
    itemp->next = jtemp->next;
    p = jtemp;
    free(p);
    p =NULL;
    jtemp = jtemp->next;
    continue;
    }
    itemp = itemp->next;
    jtemp = itemp->next;

    }

    }


    //按照顺序插入
    int main(int argc, const char *argv[])
    {
    linklist_p list = linklist_creat();

    linklist_head_insert(list,4);
    linklist_head_insert(list,100);
    linklist_head_insert(list,1);
    linklist_head_insert(list,2);
    linklist_head_insert(list,3);
    linklist_head_insert(list,7);
    linklist_head_insert(list,7);
    linklist_head_insert(list,7);
    linklist_head_insert(list,7);
    linklist_head_insert(list,7);
    linklist_head_insert(list,5);
    linklist_head_insert(list,9);
    linklist_head_insert(list,100);
    linklist_head_insert(list,8);
    linklist_head_insert(list,100);
    linklist_head_insert(list,6);

    // linklist_show(list);

    // linklist_tail_insert(list,9);
    // linklist_show(list);

    // linklist_pos_insert(list,11,100);
    // linklist_show(list);


    // printf("pos = %d ",linklist_search(list,8));

    // linklist_value_update(list,7,111);
    // linklist_show(list);

    // linklist_pos_update(list,13,11);
    // linklist_show(list);

    // printf("%d ",linklist_head_del(list));
    // linklist_show(list);

    // printf("%d ",linklist_tail_del(list));
    // linklist_show(list);


    linklist_reversal(list);
    linklist_show(list);

    // linklist_clear(list);
    // linklist_show(list);
    linklist_sort(list);
    linklist_show(list);

    linklist_repeat_del(list);
    linklist_show(list);
    return 0;
    }

  • 相关阅读:
    Java 性能优化实战记录(3)--JVM OOM的分析和原因追查
    Map/Reduce的类体系架构
    Map/Reduce个人实战--生成数据测试集
    Ubuntu 16.04下的安装RabbitMQ
    Zookeeper数据存储总结
    Zookeeper原理分析之存储结构ZkDatabase
    Zookeeper原理分析之存储结构TxnLog
    Zookeeper原理分析之存储结构Snapshot
    Kafka迁移与扩容工具用法
    Sublime Text 格式化JSON-pretty json
  • 原文地址:https://www.cnblogs.com/huiji12321/p/11228894.html
Copyright © 2020-2023  润新知