首页 > 编程语言 >【c语言编程基础】结构体单向链表的基本操作

【c语言编程基础】结构体单向链表的基本操作

时间:2022-09-30 14:56:48浏览次数:54  
标签:head Table trackers 编程 next 链表 TableNode 基本操作 ta

前言

 

关注点

 

code

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcat
#define Size 4
typedef struct Table{ 
    int len;
    int size;
    int aa;
}Table;

typedef struct TableNode{
    Table ta;
    struct TableNode *next;
} TableNode;

bool table_eq(Table a, Table b){
    bool eq = false;
    if((a.len == b.len) && (a.size==b.size)) eq=true;
    return eq;
}
TableNode *trackers = NULL;
int nodelen = 0;
// Table *t1=(Table*)calloc(Size, sizeof(Table));
void trackernode_append(Table tracker){
    printf("trackernode_append\n");
    TableNode* p = trackers;
    TableNode* tmp = (TableNode*)malloc(sizeof(TableNode));
    tmp->ta = tracker;
    tmp->next = NULL;
    if(trackers==NULL) trackers=tmp;
    else{    
        TableNode* head = trackers;
        while(head->next){ head = head->next;}
        head->next = tmp;
    }
    nodelen++;
    trackers = p;   
}
void trackernode_delete_val(Table tracker){
    printf("trackernode_delete_val\n");
    TableNode* head = trackers;
    if(table_eq(head->ta, tracker)) {
        TableNode* tmp = head;
        if(head->next) { head = head->next; trackers=head; }
        else trackers=NULL;
        free(tmp); 
    }else{
        TableNode* pre = head;
        TableNode* cur = head->next;
        while(!table_eq(cur->ta,tracker) && (cur!=NULL)){
            pre = cur;
            cur = cur->next;
       }
       if(cur!=NULL) { pre->next = cur->next; free(cur); }
    }
    trackers = head;
}
void trackernode_delete_node(TableNode* delnode){
    // TODO 
    // TableNode* head = trackers;

}

void trackernode_update(Table old, Table newd){
    printf("trackernode_update\n");
    TableNode* head = trackers;
    while(head){
        if(table_eq(head->ta,old)) { head->ta = newd; return; }
        head = head->next;
    }
}

int main()
{
    char a[8] = {0};
    strcat(a, "circle_yellow: 0.99999");
    printf("a: %s\n", a);
    int arr[Size] = {2, -1, 0, 1};
    int *p = arr;
    TableNode *head=(TableNode*)malloc(sizeof(TableNode));
    Table ta;
    ta.len = 0;
    ta.size = 0; 
    head->ta = ta;
    head->next = NULL;
    trackers = head;
    nodelen++;
    for(int i=1; i<Size; i++){
        ta.len = i;
        ta.size = i;
        TableNode *tmp=(TableNode*)malloc(sizeof(TableNode));
        tmp->ta = ta;
        tmp->next = NULL;
        head->next = tmp;
        head = tmp;
        nodelen++;
    }
    //
    Table tracker_arr[Size];
    head = trackers;
    int k=0;
    while(head){
        printf("k: %d\n", k);
        tracker_arr[k] = head->ta;
        head=head->next;
        k++;   
    }
    printf("k: %d, Size: %d\n", k, Size);
    for(int i=0; i<k; i++){
        if(p[i]==-1){
            // delete
            trackernode_delete_val(tracker_arr[i]);
            nodelen--;       
        }else{
            // update
            Table newdata;
            newdata.len = 6;
            newdata.size = 8;
            trackernode_update(tracker_arr[i], newdata);
        }
    }
    Table newdata;
    newdata.len = 3;
    newdata.size = 3;
    trackernode_append(newdata);
    head=trackers;
    while(head){
        printf("len: %d, size: %d, aa: %d\n", (head->ta).len, (head->ta).size, (head->ta).aa);
        head = head->next;
    }
    head= trackers;
    int i=0;
    while(head){
        i++;
        printf("i: %d\n", i);
        if(head->next) { printf("while\n"); head = head->next; }
        else {printf("break\n"); break; }
    }
    printf("************i: %d\n", i);
    printf("nodelen: %d\n", nodelen);
    
    return 0;
}
View Code

 

标签:head,Table,trackers,编程,next,链表,TableNode,基本操作,ta
From: https://www.cnblogs.com/happyamyhope/p/16744203.html

相关文章

  • android面试题--单链表反转
     //定义链表类classNode{intdata;Nodenext;}voidmain(){//第一步:新建链表Nodefive=newNod......
  • 加工中心加工端盖编程实例
    用卧式加工中心加工图1所示的端盖(B面及各孔),试编制加工程序。  根据图纸要求,选择A面为定位基准,用弯板装夹。加工路线如下:粗铣和精铣B面(选用φ100mm端铣刀T01、T13);粗镗、......
  • 细长螺纹轴的数车分段编程加工
    对于细长轴上的螺纹加工,一般采取搓丝加工或者普通车床上采取跟刀加工,这对操作者的技术提出很高的要求,并且效率低下,很难保证工件质量,而在数车上采用分段车削的方法就能很好的......
  • 编程基础(1)- 问题 (一) | 12 个小球称重找出其中 1 个坏球
     1.问题   有12个外观完全一样的小球,其中有1个求的重量和其它11个球不一样(或称为坏球),但是不知道是轻还是重。现在你有一架天平,只能称3次。你怎么找出这1......
  • 请问学数字孪生技术对编程能力的要求高吗?
    数字孪生技术对技术人员要求有着多个层次,如果仅仅只是应用层方面的话如果选对平台对编程能力要求可以并不高!所谓数字孪生就是物理世界的数字映射,并基于此实现科学化智能化......
  • ​加工中心编程经验分享
    加工中心编程需要注意:1.白钢刀转速不可太快。2.铜工开粗少用白钢刀,多用飞刀或合金刀。3.工件太高时,应分层用不同长度的刀开粗。4.用大刀开粗后,应用小刀再清除余料,保证余......
  • 《UNIX环境高级编程》第7-8章 进程环境和进程控制
    1.进程终止有八种方式使进程终止。其中5种是正常,它们是:从main函数返回调用exit调用_exit或_Exit最后一个线程从其启动例程返回从最后一个线程调用pthread_exit异......
  • 《unix编程艺术》总结的出色程序员十大好习惯
    看《unix编程艺术》总结的出色程序员十大良好习惯1)易于理解,利于组合。2)“只做好一件事”3)想清楚代码的组合,如何构建自己的一套API.(更加深入地理解真实世界系统状态。重构......
  • socket编程API总结
    一、代码注释1.#include<sys/types.h>#include<sys/socket.h>#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<string.h>#include<unistd.h>#include......
  • 面向对象编程
    面向过程&面向对象面向过程思想步骤清晰简单,第一步做什么,第二步做什么......面对过程适合处理一些较为简单的问题面向对象思想物以类聚,分类的思维模式,思考问题......