标签:class ret null tmp get last 插入 ++ def
更新时间:
2017.10.20 创建链表,遍历链表,插入节点,删除节点,原地逆序,求最大值,求节点个数,求平均值,摧毁链表
1.单链表的结构
struct NODE { int m_data; struct NODE *next; }; typedef struct NODE node;
2.后插法创建具有n个节点的单链表(带头结点)
node *link_list_create(unsigned int n) { node *head = NULL; node *tail_node = NULL; node *new_node = NULL; int i = 0; head = (node *)malloc(sizeof(node)); if (head == NULL) { return NULL; } head->m_data = 0; tail_node = head; for (i=0; i<n;i++) { new_node = (node *)malloc(sizeof(node)); if(new_node == NULL) { return NULL; } printf("please input the data of node %d :",i+1); scanf("%d",&new_node->m_data); new_node->next = NULL; tail_node->next = new_node; tail_node = new_node; } return head; }
3.遍历链表
void link_list_traverse(const node *head) { if (head == NULL) { return; } node *ptr = head->next; while (ptr!=NULL) { printf("%d ", ptr->m_data); ptr = ptr->next; } }
4.插入节点
void node_insert(node *head, unsigned int pos, int data) { node *new_node = NULL; node *ptr = head; int i = 0; while ((ptr!=NULL)&&(i<pos-1)) { i++; ptr = ptr->next; } if ((ptr==NULL)||(i>pos-1)) { return; } new_node = (node *)malloc(sizeof(node)); if (new_node ==NULL) { return; } new_node->m_data = data; new_node->next = ptr->next; ptr->next = new_node; }
5.删除节点
void node_delete(node *head, unsigned int pos) { node *ptr = head; node *tmp = NULL; int i = 0; while ((ptr->next!=0)&&(i<pos-1)) { i++; ptr = ptr->next; } if ((ptr->next == NULL)||(i>pos-1)) { return; } tmp = ptr->next; ptr->next = tmp->next; free(tmp); }
6.链表原地逆序
void link_list_reverse(node *head) { node *cur = NULL; node *last = NULL; node *next = NULL; if (head == NULL) { return; } cur = head->next; while (cur != NULL) { next = cur->next; cur->next = last; last = cur; cur = next; } head->next = last; }
7.获取最大值
迭代:
int get_max(const node *head) { int max = 0; node *tmp = NULL; if (head == NULL) { return -1; } tmp = head->next; max = tmp->m_data; while (tmp != NULL) { max = tmp->m_data >= max ? tmp->m_data : max; tmp = tmp->next; } return max; }
递归:
int get_max2(const node *head) { int max = 0; if (head == NULL) { return -1; } else if (head->next == NULL) { return head->m_data; } else { max = get_max(head->next); max = head->m_data >= max ? head->m_data : max; return max; } }
8.求节点个数(头结点不计入)
迭代:
int node_count(const node *head) { int count = 0; node *tmp = NULL; if (head == NULL) { return -1; } tmp = head->next; for (count = 0; tmp != NULL; count++) { tmp = tmp->next; } return count; }
递归:
int node_count2(const node *head) { int count = 0; if (head == NULL) { return -1; } else if (head->next == NULL) { return 0; } else { count = 1; count += node_count(head->next); return count; } }
9.求平均值
迭代:
float link_average(const node *head,int count) { node *tmp = NULL; float cur_ave = 0.0; if (head == NULL) { return -1.0; } tmp = head->next; cur_ave = (float)tmp->m_data/count; while (tmp != NULL) { cur_ave += (float)(tmp->m_data)/count; tmp = tmp->next; } return cur_ave; }
递归:
float link_average2(node *head, int count) { float cur_ave = 0.0; if (head == NULL) { return -1.0; } else if (head->next == NULL) { return 0.0; } else { cur_ave = (float)head->next->m_data/count; cur_ave += link_average(head->next,count); return cur_ave; } }
10.摧毁链表
void link_list_destroy(node *head) { node *ptr = NULL; while (head!=NULL) { ptr = head; head = head->next; printf("free node:%d ",ptr->m_data); free(ptr); } }
标签:class ret null tmp get last 插入 ++ def
原文地址:http://www.cnblogs.com/lumqi001/p/7700418.html