数据结构---单向链表的实现(内含c代码,已调试,可用)
10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树
本节先对单向链表的学习(主要是使用代码进行实现)
1:单向链表的理论介绍:
链表原理如下图所示:
上面展示的是一个单链表的存储原理图,简单易懂,head为头节点,他不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一个节点,就这样一节一节往下面记录,直到最后一个节点,其中的next指向null。
链表有很多种,比如单链表,双链表等等。我们就对单链表进行学习,其他的懂了原理其实是一样的。
(上面的理论也是粘贴复制的因为有太多的理论介绍了。)
2:单向链表的代码实现
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 5 typedef enum 6 { 7 //MAC_TIMESYNC_UNKNOW_STATE = -1, 8 MAC_TIMESYNC_SET_INIT = 0,//If it is in this state, the next cycle will still execute the program 9 MAC_TIMESYNC_SET_EXECTUING = 1,//function is executing 10 MAC_TIMESYNC_SET_SUCCESS = 2,//This state indicates that the formal execution of program logic is completed this time, and the state is set 11 MAC_TIMESYNC_SET_FAIL = 3,//func function execution failed 12 }DpsPortMacTimeState; 13 14 typedef struct dpsi_mac_time_Sync_State_s{ 15 int timesync_sates; 16 int bcmport; 17 }dpsi_mac_time_Sync_State_t; 18 19 typedef struct node{ 20 struct node * next; 21 dpsi_mac_time_Sync_State_t data; 22 }dpsi_mac_time_sync_state_list_t; 23 24 dpsi_mac_time_sync_state_list_t* dpsi_mac_list_head = NULL; 25 26 static void __dpsi_mac_state_list_init(void) 27 { 28 //Apply for linked list heap space 29 if(NULL == dpsi_mac_list_head) 30 { 31 dpsi_mac_list_head = (dpsi_mac_time_sync_state_list_t*)malloc(sizeof(dpsi_mac_time_sync_state_list_t)); 32 if(NULL == dpsi_mac_list_head) 33 { 34 printf("Error: __dpsi_mac_state_list_init\n"); 35 return; 36 } 37 } 38 39 return; 40 } 41 42 dpsi_mac_time_sync_state_list_t * __dpsi_mac_state_list_get_ptr(int bcmPort) 43 { 44 /*Request a temporary head pointer. 45 Avoid direct operation on the head pointer and lose the position of the head pointer*/ 46 dpsi_mac_time_sync_state_list_t* tmp_list_ptr = NULL; 47 48 tmp_list_ptr = dpsi_mac_list_head; 49 while(NULL != tmp_list_ptr && NULL != tmp_list_ptr->next) 50 { 51 /*Get next node*/ 52 if(bcmPort == tmp_list_ptr->data.bcmport) 53 { 54 printf("end p54:%d\n",bcmPort); 55 return tmp_list_ptr; 56 } 57 tmp_list_ptr = tmp_list_ptr->next; 58 } 59 printf("end p59:%p\n",tmp_list_ptr); 60 return NULL; 61 } 62 63 int dpsi_mac_state_list_set(int bcmPort, int timesync_sates) 64 { 65 dpsi_mac_time_sync_state_list_t* tmp_list_ptr = NULL; 66 dpsi_mac_time_sync_state_list_t * insert_list_data = NULL; 67 68 tmp_list_ptr = __dpsi_mac_state_list_get_ptr(bcmPort); 69 if(NULL != tmp_list_ptr) 70 { 71 printf("end p70:%d\n",bcmPort); 72 tmp_list_ptr->data.timesync_sates = timesync_sates; 73 return 1; 74 } 75 else 76 { 77 tmp_list_ptr = NULL; 78 79 } 80 81 if(NULL == dpsi_mac_list_head) 82 { 83 printf("%s dpsi_mac_port_phy_timesync_set 1 Failed: line:%d, bcmPort=%d\n", 84 __FUNCTION__, __LINE__, bcmPort); 85 return -1; 86 } 87 tmp_list_ptr = dpsi_mac_list_head; 88 89 while(NULL != tmp_list_ptr->next) 90 { 91 /*Get the last node*/ 92 tmp_list_ptr = tmp_list_ptr->next; 93 } 94 95 /*Apply for heap space of linked list nodes*/ 96 insert_list_data = (dpsi_mac_time_sync_state_list_t*)malloc(sizeof(dpsi_mac_time_sync_state_list_t)); 97 if(NULL == insert_list_data) 98 { 99 printf("%s dpsi_mac_port_phy_timesync_set 1 Failed: line:%d, bcmPort=%d\n", 100 __FUNCTION__, __LINE__, bcmPort); 101 return -1; 102 } 103 printf("end p102 : %d\n",bcmPort); 104 insert_list_data->data.bcmport = bcmPort; 105 insert_list_data->data.timesync_sates = timesync_sates; 106 insert_list_data->next = NULL; 107 tmp_list_ptr->next = insert_list_data; 108 return 1; 109 } 110 111 112 int dpsi_mac_state_list_get_value(int bcmPort) 113 { 114 /*Request a temporary head pointer. 115 Avoid direct operation on the head pointer and lose the position of the head pointer*/ 116 dpsi_mac_time_sync_state_list_t* tmp_list_ptr = NULL; 117 118 tmp_list_ptr = dpsi_mac_list_head->next; 119 while(NULL != tmp_list_ptr )//&& NULL != tmp_list_ptr->next) 120 { 121 /*Get next node*/ 122 printf("dpsi_mac_list_head is %d:%d:%d \n",bcmPort,tmp_list_ptr->data.bcmport,tmp_list_ptr->data.timesync_sates); 123 if(bcmPort == tmp_list_ptr->data.bcmport) 124 { 125 return tmp_list_ptr->data.timesync_sates; 126 } 127 tmp_list_ptr = tmp_list_ptr->next; 128 } 129 130 return -1;//MAC_TIMESYNC_SET_INIT; 131 } 132 133 void print_dpsi_mac_state_list() 134 { 135 //申请一个临时的head指针。避免对head指针的直接操作,丢失头指针的位置 136 dpsi_mac_time_sync_state_list_t* tmp_list_ptr = NULL; 137 138 tmp_list_ptr = dpsi_mac_list_head->next; 139 while(NULL != tmp_list_ptr )//&& NULL != tmp_list_ptr->next) 140 { 141 //获取下一个节点 142 printf("%d:%d\n",tmp_list_ptr->data.bcmport,tmp_list_ptr->data.timesync_sates); 143 tmp_list_ptr = tmp_list_ptr->next; 144 145 } 146 return; 147 } 148 int main() 149 { 150 151 __dpsi_mac_state_list_init(); 152 printf("start \n"); 153 if(NULL != dpsi_mac_list_head) 154 { 155 156 dpsi_mac_state_list_set(1,11); 157 dpsi_mac_state_list_set(2,22); 158 dpsi_mac_state_list_set(3,33); 159 dpsi_mac_state_list_set(4,44); 160 dpsi_mac_state_list_set(5,55); 161 dpsi_mac_state_list_set(4,99); 162 163 } 164 else 165 { 166 printf("dpsi_mac_list_head is null \n"); 167 168 } 169 170 //printf("end 3:%d\n",dpsi_mac_state_list_get_value(10)); 171 print_dpsi_mac_state_list(); 172 return 0; 173 174 }
3:运行结果: