- 1、尾删函数
- 2、按位置修改函数
- 3、按值修改函数
- 4、链表反转
- 5、linklist.h (库函数)
- 6、linklist.c (封装函数)
- 7、main.c (主函数)
函数代码块
//尾删
int list_delete_tail(Linklist *L)
{
//判断逻辑
if(NULL == L || list_empty(L))
{
printf("删除失败n");
return -1;
}
//删除逻辑
Linklist *q = L->next;
while(q->next->next != NULL)
{
q = q->next;
}
Linklist *p = q->next;
q->next = p->next;
free(p);
p = NULL;
L->len--;
printf("删除成功n");
return 0;
}
主函数代码块
//调用尾删函数 list_delete_tail(L); //遍历函数 list_show(L);
结果展示
2、按位置修改函数函数代码块
//按位置修改
int list_update_pos(Linklist *L, int pos, datatype e)
{
//判断逻辑
if(NULL == L || list_empty(L))
{
printf("修改失败n");
return -1;
}
else if(pos<1 || pos>L->len)
{
printf("输入位置不合法n");
return -2;
}
//调用查找函数
Linklist *p = node_find(L, pos);
//修改
p->data = e;
printf("修改成功n");
return 0;
}
主函数代码块
//按位置修改 list_update_pos(L, 0, 'K'); list_update_pos(L, 10, 'A'); list_update_pos(L, 2, 'K'); //遍历函数 list_show(L);
结果展示
函数代码块
//按值修改
int list_update_value(Linklist *L, datatype old_e, datatype new_e)
{
//判断逻辑
int flag = 0;
if(NULL==L || list_empty(L))
{
printf("修改失败n");
return -1;
}
//循环按值查找
Linklist *q = L->next;
while(q->next != NULL)
{
if(q->data == old_e)
{
q->data = new_e;
flag = 1; //判断是否进行过修改
}
q = q->next;
}
if(flag == 1)
{
printf("修改成功n");
return 0;
}
else
{
printf("输入的值不存在n");
return -2;
}
}
主函数代码块
//按值修改函数 list_update_value(L, 'E', 'A'); list_update_value(L, 'T', 'B'); list_update_value(L, 'C', 'H'); //遍历函数 list_show(L);
结果展示
函数代码块
void list_reverse(Linklist *L)
{
datatype temp;
if(NULL==L || list_empty(L))
{
printf("反转失败n");
return ;
}
//从开头逐个交换
Linklist *p = L->next;
for(int i=0; ilen; i++)
{
for(int j=i+1; jlen; j++)
{
temp = p->data;
p->data = p->next->data;
p->next->data = temp;
p = p->next;
}
p = L->next;
}
printf("反转成功n");
}
主函数代码块
//链表反转 list_reverse(L); //遍历函数 list_show(L);
结果展示
代码
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
typedef char datatype;
typedef struct Node
{
union
{
datatype data; //数据域
int len;
};
struct Node *next; //指针域
}Linklist;
//创建
Linklist *list_create();
//申请节点
Linklist *node_apply(datatype e);
//判空
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(Linklist *L, int pos, datatype e);
//按位置查找
Linklist *node_find(Linklist *L, int pos);
//头删
int list_delete_head(Linklist *L);
//尾删
int list_delete_tail(Linklist *L);
//任意删
int list_delete(Linklist *L, int pos);
//按值查找返回第一个查找成功的位置
int list_search_value(Linklist *L, datatype e);
//按位置修改
int list_update_pos(Linklist *L, int pos, datatype e);
//按值修改
int list_update_value(Linklist *L, datatype old_e, datatype new_e);
//链表反转
void list_reverse(Linklist *L);
//销毁链表
void linklist_free(Linklist *L);
6、linklist.c (封装函数)
#include7、main.c (主函数)#include #include"linklist.h" //创建 Linklist *list_create() { Linklist* L = (Linklist*)malloc(sizeof(Linklist)); if(NULL == L) { printf("创建失败n"); return NULL; } //初始化 L->len = 0; L->next = NULL; printf("创建成功n"); return L; } //判空 int list_empty(Linklist *L) { // 1 表示空 0表示非空 return NULL==L->next ? 1:0; } //头插 int list_insert_head(Linklist *L, datatype e) { //判断条件 if(NULL == L) { printf("所给链表不合法n"); return -1; } //申请节点 Linklist *p = (Linklist*)malloc(sizeof(Linklist)); //将要插入的数据放入节点 p->data = e; p->next = NULL; //完成头插 p->next = L->next; L->next = p; //表变化 L->len++; printf("头插成功n"); } //遍历 void list_show(Linklist *L) { //判断逻辑 if(list_empty(L)) { printf("遍历失败,表为空n"); return; } //遍历逻辑 Linklist *q = L->next; printf("当前链表内容为:"); while(q != NULL) { printf("%ct", q->data); q = q->next; } printf("n"); } //申请节点 Linklist *node_apply(datatype e) { Linklist *p = (Linklist*)malloc(sizeof(Linklist)); if(NULL == p) { printf("节点申请失败n"); return NULL; } //将数据存到节点中 p->data = e; p->next = NULL; return p; } //尾插 int list_insert_tail(Linklist *L, datatype e) { if(list_empty(L)) { printf("插入失败,表为空n"); return -1; } Linklist *p = node_apply(e); Linklist *q = L->next; while(q->next != NULL) { q = q->next; } q->next = p; printf("尾插成功n"); L->len++; return 0; } //按位置查找 Linklist *node_find(Linklist *L, int pos) { if(NULL==L || 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_insert(Linklist *L, int pos, datatype e) { if(NULL==L || pos<1 || pos>L->len+1) { printf("插入失败n"); return -1; } Linklist *p = node_apply(e); Linklist *q = node_find(L, pos-1); p->next = q->next; q->next = p; L->len++; printf("插入成功n"); return 0; } //头删 int list_delete_head(Linklist *L) { if(NULL==L || 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(Linklist *L, int pos) { if(NULL==L || list_empty(L->next) || pos>L->len || pos<1) { printf("删除失败n"); return -1; } Linklist *q = node_find(L, pos-1); Linklist *p = q->next; q->next = p->next; free(p); p=NULL; L->len--; printf("删除成功n"); return 0; } //尾删 int list_delete_tail(Linklist *L) { if(NULL == L || list_empty(L)) { printf("尾删失败n"); return -1; } Linklist *q = L->next; while(q->next->next != NULL) { q = q->next; } Linklist *p = q->next; q->next = p->next; free(p); p = NULL; L->len--; printf("尾删成功n"); return 0; } //按值查找返回第一个查找成功的位置 int list_search_value(Linklist *L, datatype e) { if(NULL==L || 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 e) { if(NULL == L || list_empty(L)) { printf("修改失败n"); return -1; } else if(pos<1 || pos>L->len) { printf("输入位置不合法n"); return -2; } Linklist *p = node_find(L, pos); p->data = e; printf("修改成功n"); return 0; } //按值修改 int list_update_value(Linklist *L, datatype old_e, datatype new_e) { int flag = 0; if(NULL==L || list_empty(L)) { printf("修改失败n"); return -1; } Linklist *q = L->next; while(q->next != NULL) { if(q->data == old_e) { q->data = new_e; flag = 1; } q = q->next; } if(flag == 1) { printf("修改成功n"); return 0; } else { printf("输入的值不存在n"); return -2; } } //链表反转 void list_reverse(Linklist *L) { datatype temp; if(NULL==L || list_empty(L)) { printf("反转失败n"); return ; } Linklist *p = L->next; for(int i=0; i len; i++) { for(int j=i+1; j len; j++) { temp = p->data; p->data = p->next->data; p->next->data = temp; p = p->next; } p = L->next; } printf("反转成功n"); } //销毁链表 void linklist_free(Linklist *L) { if(NULL == L) { return; } while(L->next != NULL) { list_delete_head(L); } free(L); L = NULL; printf("销毁成功n"); }
#include#include"linklist.h" #include int main(int argc, const char *argv[]) { Linklist *L = list_create(); if(NULL == L) { return -1; } Linklist pos; //调用头插函数 list_insert_head(L, 'Q'); list_insert_head(L, 'W'); list_insert_head(L, 'E'); list_insert_head(L, 'R'); //遍历函数 list_show(L); //调用尾插函数 list_insert_tail(L, 'T'); list_insert_tail(L, 'Y'); //遍历函数 list_show(L); //调用插入函数 list_insert(L, 0, 'P'); list_insert(L, 3, 'U'); list_insert(L, 7, 'P'); list_insert(L, 9, 'I'); //遍历函数 list_show(L); //调用头删函数 list_delete_head(L); //遍历函数 list_show(L); //调用尾删函数 list_delete_tail(L); //遍历函数 list_show(L); //调用任意删除函数 list_delete(L, 6); list_delete(L, 7); list_delete_tail(L); //遍历函数 list_show(L); //按位置修改 list_update_pos(L, 0, 'K'); list_update_pos(L, 10, 'A'); list_update_pos(L, 2, 'K'); //遍历函数 list_show(L); //按值修改函数 list_update_value(L, 'E', 'A'); list_update_value(L, 'T', 'B'); list_update_value(L, 'C', 'H'); //遍历函数 list_show(L); //测试按值查找函数 int res = list_search_value(L, 'Q'); if(res == -1) { printf("查找失败n"); } else if(res == 0) { printf("不存在n"); } else if(res > 0) { printf("查找成功,该值在第%d的位置n", res); } list_show(L); //链表反转 list_reverse(L); list_show(L); //销毁链表 linklist_free(L); return 0; }



