#include "linklist.h"
#include <stdio.h>
#include <stdlib.h>
//创建
linklist create()
{
linklist l=(linklist)malloc(sizeof(Node));
if(NULL==l)
{
printf("创建失败\n");
return NULL;
}
l->len=0;
l->next=NULL;
printf("创建成功\n");
return l;
}
//判空
int empty(linklist l)
{
return l->next==NULL ? 1: 0;
}
//申请的节点
linklist make_node(datatype e)
{
linklist p=(linklist)malloc(sizeof(Node));
if(NULL==p)
{
printf("插入内容失败\n");
return NULL;
}
p->data=e;
p->next=NULL;
return p;
}
//按位置查找
linklist find_node(linklist l,int pos)
{
if(NULL==l || empty(l) || pos<0 || pos>l->len)
{
printf("查找失败\n");
return NULL;
}
//开始查找
linklist q=l;
for(int i=1;i<=pos;i++)
{
q=q->next;
}
//将找到的第pos个节点返回
return q;
}
//按值查找
linklist find_value(linklist l,datatype e)
{
if(NULL==l || empty(l))
{
printf("查找失败\n");
return NULL;
}
linklist q=l->next;
while(q!=NULL)
{
if(q->data==e)
{
printf("查找成功\n");
return q;
}
q=q->next;
}
printf("查找失败\n");
}
//按值修改
int update_value(linklist l,datatype old_e,datatype new_e)
{
if(NULL==l || empty(l))
{
printf("修改失败\n");
return -1;
}
linklist p=find_value(l,old_e);
if(NULL==p)
{
return -1;
}
p->data=new_e;
printf("%c\n",p->data);
printf("修改成功\n");
return 0;
}
//按位置修改
int update_pos(linklist l,datatype new_e,int pos)
{
if(NULL==l || empty(l) || pos<1 || pos>l->len)
{
printf("修改失败\n");
return -1;
}
linklist p=find_node(l,pos);
if(NULL==p)
{
return -1;
}
p->data=new_e;
printf("%c\n",p->data);
printf("修改成功\n");
return 0;
}
//头插
int head(linklist l,datatype e)
{
if(NULL==l)
{
printf("插入失败\n");
return -1;
}
linklist p=make_node(e);
//头插逻辑
p->next=l->next;
l->next=p;
l->len++;
printf("插入成功\n");
return 0;
}
//头删除
int delete_head(linklist l)
{
if(NULL==l || empty(l))
{
printf("删除失败\n");
return -1;
}
linklist p=l->next;//标记要删除的节点
l->next=p->next;//孤立它
l->len--;
free(p);
p=NULL;
printf("删除成功\n");
return 0;
}
//尾插
int tail(linklist l,datatype e)
{
if(NULL==l)
{
printf("插入失败\n");
return -1;
}
linklist q=find_node(l,l->len);
linklist p=make_node(e);
p->next=q->next;
q->next=p;
l->len++;
printf("插入成功\n");
return 0;
}
//尾删
int delete_tail(linklist l)
{
if(NULL==l || empty(l))
{
printf("删除失败\n");
return -1;
}
linklist q=find_node(l,l->len-1);
linklist p=q->next;
q->next=p->next;
l->len--;
free(p);
p=NULL;
printf("删除成功\n");
return 0;
}
//任意删
int delete_pos(linklist l,int pos)
{
if(NULL==l || empty(l) || pos<1 || pos>l->len)
{
printf("删除失败\n");
return -1;
}
linklist q=find_node(l,pos-1);
linklist p=q->next;
q->next=p->next;
l->len--;
free(p);
p=NULL;
printf("删除成功\n");
return 0;
}
//任意插
int else_pos(linklist l,datatype e,int pos)
{
if(NULL==l || pos<1 || pos>l->len+1)
{
printf("任意插入失败\n");
return -1;
}
linklist q=find_node(l,pos-1);
linklist p=make_node(e);
p->next=q->next;
q->next=p;
l->len++;
printf("插入成功\n");
return 0;
}
//遍历
void show(linklist l)
{
if(NULL==l || empty(l))
{
printf("遍历失败\n");
return;
}
//需要一个指针指向第一个next并往下走
//遍历每一个data,再到自己的next指向下一个
linklist first = l->next;
while(first!=NULL)
{
printf("%c\t",first->data);
first=first->next;
}
// putchar(10);
printf("遍历成功\n");
}
//释放
void my_free(linklist l)
{
if(NULL==l)
{
printf("释放失败\n");
return;
}
while(!empty(l))
{
delete_head(l);
}
free(l);
l=NULL;
printf("释放成功\n");
}
//逆置
void reverse(linklist l)
{
if(NULL==l || empty(l))
{
printf("未逆置\n");
return;
}
linklist first=l->next;
linklist final=find_node(l,l->len);
while(NULL!=first->next)
{
head(l,final->data);
printf("逆置\n");
first=first->next;
}
}
//链表合并
void merga(linklist l,linklist s)
{
if(NULL==l || NULL==s ||empty(s) || empty(l))
{
printf("未合并\n");
return;
}
linklist p=l;
while(NULL!=p->next)
{
p=p->next;
}
p->next=s->next;
l->len+=s->len;
free(s);
s=NULL;
printf("合并成功\n");
}
链表 9.15作业
最新推荐文章于 2025-05-28 22:18:33 发布