单向链表代码
#ifndef _LINK_H_#define _LINK_H_typedef int DataType;typedef struct node
{DataType data;struct node *pnext;
}Link_Node_t;typedef struct link
{Link_Node_t *phead;int clen;
}Link_t;extern Link_t *link_creat();
extern int push_link_head(Link_t *plink, DataType data);
extern int print_link_all(Link_t *plink);
extern int push_link_tail(Link_t *plink, DataType data);
extern int pop_link_head(Link_t *plink);
extern int pop_link_tail(Link_t *plink);
extern Link_Node_t * find_link_data(Link_t *plink, DataType data);
extern int change_link_data(Link_t *plink, DataType des, DataType src);
extern int delall_link_data(Link_t *plink);
extern Link_Node_t* med_link_data(Link_t *plink);
extern Link_Node_t* find_link_tail_k(Link_t* plink, int k);
extern int del_k_link(Link_t *plink, int k);#endif
#include "link.h"
#include <stdio.h>
int main(void)
{int ret = 0;Link_Node_t* find = NULL;Link_t *plink = link_creat();if(plink == NULL){printf("link_creat fail");return -1;}push_link_head(plink, 1);push_link_head(plink, 2);push_link_head(plink, 3);push_link_head(plink, 4);push_link_head(plink, 5);push_link_tail(plink, 6);push_link_tail(plink, 7);push_link_tail(plink, 8);push_link_tail(plink, 9);print_link_all(plink);pop_link_head(plink);pop_link_tail(plink);print_link_all(plink);find = find_link_data(plink, 10);if(NULL == find){printf("没找到\n");}else{printf("index = %p\n", find);}ret = change_link_data(plink, 3, 50);if(ret == 1){printf("没有需要修改的数据\n");}print_link_all(plink);//delall_link_data(plink);/*printf("清除\n");plink = link_creat();push_link_tail(plink, 6);print_link_all(plink);
*/find = med_link_data(plink);if(NULL == find){printf("空链表\n");}else{printf("index = %p\n", find);}find = find_link_tail_k(plink, 4);if(NULL == find){printf("没找到\n");}else{printf("index = %p\n", find);}ret = del_k_link(plink, 4);if(-1 == ret){printf("不存在该节点\n");}print_link_all(plink);return 0;
}
#include "link.h"
#include <stdlib.h>
#include <stdio.h>//创建头部
Link_t *link_creat()
{Link_t *plink = (Link_t *)malloc(sizeof(Link_t));if(NULL == plink){perror("malloc fail");return NULL;}plink->phead = NULL;plink->clen = 0;return plink;
}//头插
int push_link_head(Link_t *plink, DataType data)
{Link_Node_t *pnode = (Link_Node_t *)malloc(sizeof(Link_Node_t));if(NULL == pnode){perror("malloc fail");return -1;}pnode->data = data;pnode->pnext = NULL;pnode->pnext = plink->phead;plink->phead = pnode;plink->clen++;return 0;
}
//判空
int is_empty_link(Link_t *plink)
{return NULL == plink->phead;
}//尾插
int push_link_tail(Link_t *plink, DataType data)
{Link_Node_t *pnode = (Link_Node_t *)malloc(sizeof(Link_Node_t));if(NULL == pnode){perror("malloc fail");return -1;}pnode->data = data;pnode->pnext = NULL;Link_Node_t *p = plink->phead;if(is_empty_link(plink)){plink->phead = pnode;}else{while(p->pnext != NULL){p = p->pnext;}p->pnext = pnode;}plink->clen++;return 0;
}//遍历
int print_link_all(Link_t *plink)
{Link_Node_t *p = plink->phead;while(p != NULL){printf("%d ", p->data);p = p->pnext;}putchar('\n');return 0;
}//头删
int pop_link_head(Link_t *plink)
{int i = 0;if(is_empty_link(plink)){i = 0; }else{Link_Node_t *p = plink->phead;plink->phead = p->pnext;p->pnext = NULL;free(p);plink->clen--;i = 1;}return i;
}//尾删
int pop_link_tail(Link_t *plink)
{int i = 0;if(is_empty_link(plink)){i = 0;}else{if(plink->clen == 1){pop_link_head(plink);}else{Link_Node_t *p = plink->phead;while(p->pnext->pnext != NULL){p = p->pnext;}free(p->pnext);p->pnext = NULL;i = 1;plink->clen--;}}return i;
}
//查找对应数据的节点地址
Link_Node_t * find_link_data(Link_t *plink, DataType data)
{Link_Node_t *p = plink->phead;while(p != NULL){if(p->data == data){return p;}p = p->pnext;}return NULL;
}
//改变对应数据
int change_link_data(Link_t *plink, DataType des, DataType src)
{Link_Node_t *p = plink->phead;while(p != NULL){if(p->data == des){p->data = src;return 0;}p = p->pnext;}return 1;
}
//清楚
int delall_link_data(Link_t *plink)
{while(1){if(is_empty_link(plink)){free(plink);break;}else{pop_link_head(plink);}}return 0;
}Link_Node_t* med_link_data(Link_t *plink)
{printf("clen = %d\n", plink->clen);int med = (plink->clen / 2) + 1;int num = 1;Link_Node_t *p = plink->phead;if(plink->clen == 0){return NULL;}while(p != NULL){if(num == med){printf("data = %d\n", p->data);return p;}p = p->pnext;num ++;}return NULL;
}Link_Node_t* find_link_tail_k(Link_t* plink, int k)
{int num = 0;if(k > plink->clen){return NULL;}int find_k = plink->clen - k;printf("num = %d k = %d\n", num, k);Link_Node_t *p = plink->phead;while(p != NULL){if(num == find_k){printf("data = %d\n", p->data);return p;}++num;p = p->pnext;}return NULL;
}int del_k_link(Link_t *plink, int k)
{int num = 1;if(k > plink->clen){return -1;}else if(k == 1){pop_link_head(plink);return 0;}else if(k == plink->clen){pop_link_tail(plink);return 0;}Link_Node_t* p = plink->phead;while(p != NULL){if(num == k - 1){Link_Node_t *p1 = p->pnext;p->pnext = p->pnext->pnext;free(p1);}++num;p = p->pnext;}return 0;
}