文章目录创作本文的目的:记录自己的学习历程
- 一、尾删函数
- 1.函数体
- 2.测试代码
- 3.运行结果
- 二、按位置修改函数
- 1.函数体
- 2.测试代码
- 3.运行结果
- 三、按值修改函数
- 1.函数体
- 2.测试代码
- 3.运行结果
- 四、链表反转函数
- 1.函数体
- 2.测试代码
- 3.运行结果
- 附:全代码
- 1.linklist.h
- 2.linklist.c
- 3.main.c
一、尾删函数 1.函数体
代码如下:
//尾删
int list_delete_tail(Linklist *L)
{
if(NULL==L || list_empty(L))
{
printf("所给链表不合法n");
return -1;
}
Linklist *p=find_node(L,L->len-1);
free(p->next);
p->next=NULL;
L->len--;
printf("尾删成功n");
return 0;
}
2.测试代码
代码如下:
#include "linklist.h" #include3.运行结果int main(int argc, const char *argv[]) { Linklist *L = list_create(); if(NULL==L) { return -1; } //添加数据 list_insert_tail(L,'H'); list_insert_tail(L,'E'); list_insert_tail(L,'L'); list_insert_tail(L,'J'); list_insert_tail(L,'U'); list_insert_tail(L,'P'); list_insert_tail(L,'O'); list_show(L); //尾删 int count = L->len; for(int i=0;i list_delete_tail(L); list_show(L); } //销毁 list_free(L); L=NULL; list_show(L); return 0; }
二、按位置修改函数 1.函数体
代码如下:
//按位置修改
int list_update_pos(Linklist *L,int pos,datatype e)
{
if(NULL==L || list_empty(L))
{
printf("所给链表不合法n");
return -1;
}
else if(pos<=0 || pos>L->len)
{
printf("位置不正确n");
return -2;
}
Linklist *p = find_node(L,pos);
p->data=e;
printf("按位置修改成功n");
return 0;
}
2.测试代码
代码如下:
#include "linklist.h" #include3.运行结果int main(int argc, const char *argv[]) { Linklist *L = list_create(); if(NULL==L) { return -1; } //添加数据 list_insert_tail(L,'H'); list_insert_tail(L,'E'); list_insert_tail(L,'L'); list_insert_tail(L,'J'); list_insert_tail(L,'U'); list_insert_tail(L,'P'); list_insert_tail(L,'O'); list_show(L); //按位置修改 list_update_pos(L,0,'A'); list_show(L); list_update_pos(L,1,'A'); list_show(L); list_update_pos(L,7,'A'); list_show(L); list_update_pos(L,8,'A'); list_show(L); list_update_pos(L,5,'A'); list_show(L); //销毁 list_free(L); L=NULL; list_show(L); return 0; }
三、按值修改函数 1.函数体
代码如下:
//按值修改
int list_update_value(Linklist *L,datatype old,datatype new)
{
int flag=0;
if(NULL==L || list_empty(L))
{
printf("所给链表不合法n");
return -1;
}
Linklist *q=L->next;
while(q!=NULL)
{
if(q->data==old)
{
q->data=new;
flag=1;
}
q=q->next;
}
if(flag)
printf("按值修改完成n");
else
printf("表中无此值n");
return 0;
}
2.测试代码
代码如下:
#include "linklist.h" #include3.运行结果int main(int argc, const char *argv[]) { Linklist *L = list_create(); if(NULL==L) { return -1; } //添加数据 list_insert_tail(L,'H'); list_insert_tail(L,'H'); list_insert_tail(L,'H'); list_insert_tail(L,'E'); list_insert_tail(L,'L'); list_insert_tail(L,'J'); list_insert_tail(L,'U'); list_insert_tail(L,'P'); list_insert_tail(L,'O'); list_show(L); //按值修改 list_update_value(L,'H','1'); list_show(L); list_update_value(L,'O','7'); list_show(L); list_update_value(L,'J','4'); list_show(L); list_update_value(L,'S','2'); list_show(L); //销毁 list_free(L); L=NULL; list_show(L); return 0; }
四、链表反转函数 1.函数体
代码如下:
//链表反转
void list_reverse(Linklist *L)
{
if(NULL==L || list_empty(L))
{
printf("所给链表不合法n");
return;
}
Linklist *start,*end;
datatype temp;
for(int i=0;ilen/2;i++)
{
start=find_node(L,i+1);
end=find_node(L,L->len-i);
temp=start->data;
start->data=end->data;
end->data=temp;
}
printf("反转完成n");
}
2.测试代码
代码如下:
#include "linklist.h" #include3.运行结果int main(int argc, const char *argv[]) { Linklist *L = list_create(); if(NULL==L) { return -1; } //添加数据 list_insert_tail(L,'H'); list_insert_tail(L,'E'); list_insert_tail(L,'L'); list_insert_tail(L,'J'); list_insert_tail(L,'U'); list_insert_tail(L,'P'); list_insert_tail(L,'O'); list_show(L); //反转 list_reverse(L); list_show(L); //销毁 list_free(L); L=NULL; list_show(L); return 0; }
附:全代码 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 *);
//申请节点函数
Linklist *Node_apply(datatype );
//头插
int list_insert_head(Linklist *,datatype );
//遍历
void list_show(Linklist *);
//尾插
int list_insert_tail(Linklist *,datatype );
//任意插
int list_insert_anywhere(Linklist *,int ,datatype );
//按位置查找返回找到的节点
Linklist *find_node(Linklist *,int );
//头删
int list_delete_head(Linklist *);
//尾删
int list_delete_tail(Linklist *);
//任意删
int list_delete_anywhere(Linklist *,int );
//按值查找返回第一个查找成功的位置
int list_search_value(Linklist *,datatype );
//按位置修改
int list_update_pos(Linklist *,int ,datatype );
//按值修改
int list_update_value(Linklist *,datatype ,datatype );
//销毁
void list_free(Linklist *);
//链表反转
void list_reverse(Linklist *);
#endif
2.linklist.c
#include3.main.c#include "linklist.h" #include //创建 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) { if(NULL==L) { printf("表不合法n"); return -1; } return NULL==L->next?1:0; } //申请节点函数 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_head(Linklist *L,datatype e) { if(NULL==L) { printf("所给链表不合法n"); return -1; } Linklist *p =Node_apply(e); p->next = L->next; L->next = p; L->len++; //printf("头插成功n"); return 0; } //遍历 void list_show(Linklist *L) { if(NULL==L || list_empty(L)) { printf("表空,遍历失败n"); return; } printf("链表元素为:"); Linklist *q = L->next; while(q != NULL) { printf("%ct",q->data); q = q->next; } printf("n"); } //尾插 int list_insert_tail(Linklist *L,datatype e) { if(NULL == L) { printf("所给链表不合法n"); return -1; } Linklist *p = Node_apply(e); Linklist *q=L; while (q->next!=NULL) { q=q->next; } q->next = p; L->len++; //printf("尾插成功n"); return 0; } //按位置查找返回节点 Linklist *find_node(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_anywhere(Linklist *L,int pos,datatype e) { if(NULL==L || pos<1 || pos>L->len+1) { printf("所给链表不合法n"); return -1; } Linklist *p=find_node(L,pos-1); //可判断 Linklist *q=Node_apply(e); //可判断 q->next=p->next; p->next=q; 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_tail(Linklist *L) { if(NULL==L || list_empty(L)) { printf("所给链表不合法n"); return -1; } Linklist *p=find_node(L,L->len-1); free(p->next); p->next=NULL; L->len--; printf("尾删成功n"); return 0; } //任意删 int list_delete_anywhere(Linklist *L,int pos) { if(NULL==L || list_empty(L)) { printf("所给链表不合法n"); return -1; } if(pos<1 || pos>L->len) { printf("位置不正确,删除失败n"); return -2; } Linklist *p=find_node(L,pos-1); Linklist *q=p->next; p->next=q->next; free(q); q=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 len;i++) { if(q->data == e) { return i; } q=q->next; } printf("查无此符n"); 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<=0 || pos>L->len) { printf("位置不正确n"); return -2; } Linklist *p = find_node(L,pos); p->data=e; printf("按位置修改成功n"); return 0; } //按值修改 int list_update_value(Linklist *L,datatype old,datatype new) { int flag=0; if(NULL==L || list_empty(L)) { printf("所给链表不合法n"); return -1; } Linklist *q=L->next; while(q!=NULL) { if(q->data==old) { q->data=new; flag=1; } q=q->next; } if(flag) printf("按值修改完成n"); else printf("表中无此值n"); return 0; } //销毁 void list_free(Linklist *L) { if(NULL==L) { printf("不合法n"); return; } while(L->next!=NULL) { list_delete_head(L); } free(L); L=NULL; printf("释放完成n"); } //链表反转 void list_reverse(Linklist *L) { if(NULL==L || list_empty(L)) { printf("所给链表不合法n"); return; } Linklist *start,*end; datatype temp; for(int i=0;i len/2;i++) { start=find_node(L,i+1); end=find_node(L,L->len-i); temp=start->data; start->data=end->data; end->data=temp; } printf("反转完成n"); }
#include "linklist.h" #includeint main(int argc, const char *argv[]) { Linklist *L = list_create(); if(NULL==L) { return -1; } //添加数据 list_insert_tail(L,'H'); list_insert_tail(L,'E'); list_insert_tail(L,'L'); list_insert_tail(L,'J'); list_insert_tail(L,'U'); list_insert_tail(L,'P'); list_insert_tail(L,'O'); list_show(L); //销毁 list_free(L); L=NULL; list_show(L); return 0; }



