1、linklist.h
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
typedef char datatype;
typedef struct Node
{
union{
datatype data;
int len;
};
struct Node *next;
}Linklist;
//创建
Linklist *list_create();
//判空
int list_empty(Linklist *L);
//头插
int list_insert_head(Linklist *L,datatype e);
//遍历
void list_show(Linklist *L);
//尾插
int list_insert_tail(Linklist *L,datatype e);
//任意插
int list_insert_pos(Linklist *L,int pos,datatype e);
//按位置查找
Linklist *find_node(Linklist *L,int pos);
//头删
int list_delete_head(Linklist *L);
//尾删
int list_delete_tail(Linklist *L);
//任意删
int list_delete_pos(Linklist *L,int pos);
//按值查找
int list_search_value(Linklist *L,datatype e);
//按位置修改
int list_update_pos(Linklist *L,int pos,datatype new_e);
//按值修改
int list_update_value(Linklist *L,datatype old_e,datatype new_e);
//链表翻转
void list_reverse(Linklist *L);
//销毁
void list_free(Linklist *L);
#endif
2、linklist.c
#include#include"linklist.h" #include //创建 Linklist *list_create() { Linklist *L = (Linklist *)malloc(sizeof(Linklist)); if(L == NULL) { printf("创建失败n"); return NULL; } //初始化 L->len=0; L->next=NULL; printf("创建成功n"); return L; } //判空 int list_empty(Linklist *L) { return NULL==L->next?1:0; //1表示空,0表示非空 } //头插 int list_insert_head(Linklist *L,datatype e) { //判断条件 if(L == NULL) { printf("链表不合法n"); return -1; } //申请节点 Linklist *P = (Linklist *)malloc(sizeof(Linklist)); if(L == NULL) { printf("节点申请失败n"); return -1; } //将要插入的数据放入节点 P->data = e; P->next = NULL; //完成头插 P->next = L->next; L->next = P; //表的变化 L->len++; printf("头插成功n"); return 0; } //遍历 void list_show(Linklist *L) { printf("链表元素分别是:"); //判断逻辑 if(L==NULL || list_empty(L)) { printf("表空n"); return; } //遍历逻辑 Linklist *q = L->next; while(q != NULL) { printf("%ct",q->data); q=q->next; } putchar(10); } //定义申请节点函数 Linklist *node_buy(datatype e) { Linklist *p = (Linklist *)malloc(sizeof(Linklist)); if(p == NULL) { printf("申请节点失败n"); return NULL; } //将数据存入节点中 p->data = e; p->next = NULL; } //尾插 int list_insert_tail(Linklist *L,datatype e) { //判断逻辑 if(list_empty(L)) { printf("表空n"); return -1; } //申请节点 Linklist *p = node_buy(e); //遍历指针指向最后一个节点 Linklist *q = L; while(q->next != NULL) { q=q->next; } //尾插逻辑 q->next=p; //表的变化 L->len++; printf("尾插成功n"); return 0; } //任意插 int list_insert_pos(Linklist *L,int pos,datatype e) { //判断逻辑 if(L == NULL || pos<1 || pos>=L->len) { printf("查找失败n"); return -1; } //申请节点存放数据 Linklist *p = node_buy(e); //查找要插入位置的前驱节点 Linklist *q = find_node(L,pos-1); //插入逻辑 p->next = q->next; q->next = p; //表的变化 L->len++; printf("插入成功n"); return 0; } //按位置查找 Linklist *find_node(Linklist *L,int pos) { //判断逻辑 if(L == NULL || pos<0 || pos>L->len) { printf("查找失败n"); return NULL; } //查找节点 Linklist *q = L; for(int i=1;i<=pos;i++) { q=q->next; } return q; //将找到的节点返回 } //头删 int list_delete_head(Linklist *L) { //判断逻辑 if(L ==NULL || list_empty(L)) { printf("删除失败n"); return -1; } //头删 Linklist *p = L->next; L->next = p->next; free(p); p=NULL; //表的变化 L->len--; printf("头删成功n"); return 0; } //尾删 int list_delete_tail(Linklist *L) { //判断逻辑 if(L ==NULL || list_empty(L)) { printf("删除失败n"); return -1; } //尾删 int s=L->len-1; Linklist *q = find_node(L,s); Linklist *p = q->next; q->next = p->next; free(p); p=NULL; //表的变化 L->len--; printf("尾删成功n"); return 0; } //任意删 int list_delete_pos(Linklist *L,int pos) { //判断逻辑 if(L ==NULL || list_empty(L)) { printf("删除失败n"); return -1; } //查找到要删除的位置 Linklist *q = find_node(L,pos-1); //删除节点 Linklist *p = q->next; q->next = p->next; free(p); p=NULL; //表的变化 L->len--; printf("************第%d个位置节点删除成功n",pos); return 0; } //按值查找 int list_search_value(Linklist *L,datatype e) { if(L == NULL || list_empty(L)) { printf("查找失败n"); return -1; } //查找逻辑 Linklist *q = L->next; for(int i=1;i<=L->len;i++) { if(q->data == e) { return i; } q = q->next; } return 0; } //按位置修改 int list_update_pos(Linklist *L,int pos,datatype new_e) { if(L == NULL || pos<0 || pos>L->len) { printf("查找失败n"); return -1; } Linklist *p = find_node(L,pos); p->data = new_e; } //按值修改 int list_update_value(Linklist *L,datatype old_e,datatype new_e) { if(L == NULL) { printf("查找失败n"); return -1; } int res = list_search_value(L,old_e); if(res == 0) { printf("未查找到n"); }else if(res > 0) { Linklist *p = find_node(L,res); p->data = new_e; } } //链表翻转 void list_reverse(Linklist *L) { if(L == NULL || L->len <= 1) { printf("翻转失败n"); } Linklist *S = L->next; L->next = NULL; //断掉头节点控制权 Linklist *q = NULL; //定义搬运工节点 while(S != NULL) { q = S; S-S->next; //以头插形式插入 q->next = L->next; L->next = q; } } //销毁 void list_free(Linklist *L) { if(L == NULL) { return; } while(L->next != NULL) { list_delete_head(L); } free(L); L=NULL; printf("释放完成n"); return; }
3、main.c
#include#include #include"linklist.h" int main(int argc, const char *argv[]) { //创建链表 Linklist *L=list_create(); if(L == NULL) { return -1; } //调用头插 list_insert_head(L,'h'); list_insert_head(L,'e'); list_insert_head(L,'l'); list_insert_head(L,'l'); list_insert_head(L,'o'); printf("L->len=%dn",L->len); //调用遍历 list_show(L); //调用尾插 list_insert_tail(L,'w'); list_insert_tail(L,'o'); list_insert_tail(L,'r'); list_insert_tail(L,'l'); list_insert_tail(L,'d'); list_show(L); //任意插 list_insert_pos(L,6,' '); printf("************在第6个位置插入空格,结果如下:n"); list_show(L); //头删 list_delete_head(L); list_show(L); //尾删 list_delete_tail(L); list_show(L); //任意删 list_delete_pos(L,4); list_show(L); //按值查找 int res; res = list_search_value(L,'o'); if(res == 0) { printf("未查找到n"); }else if(res > 0) { printf("************** 查找成功,'o'的位置是在第%d个n",res); } //按位置修改 list_update_pos(L,2,'U'); printf("***************将第二个位置的值修改为'U'后结果如下:n"); list_show(L); //按值修改 list_update_value(L,'w','R'); printf("***************将'w'修改为'R'后结果如下:n"); list_show(L); //链表翻转 printf("链表翻转后结果为:"); list_reverse(L); //销毁 list_free(L); L=NULL; list_show(L); return 0; }
执行结果:



