/********************************主函数************/
#include "main.h"
int main(int argc, const char *argv[])
{
linklistptr L=list_create();
if(NULL==L)
{
return -1;
}
list_insert_head(L,'q');
list_insert_head(L,'d');
list_insert_head(L,'a');
list_insert_head(L,'s');
list_put(L);
list_add(L,3,'c');
list_put(L);
list_insert_tail(L,'f');
list_put(L);
list_delete_head(L);
list_put(L);
list_delete_tail(L);
list_put(L);
list_delete_pos(L,2);
list_put(L);
list_reverse(L);
list_put(L);
list_search_vlaue(L,'a');
list_xg(L,2,'f');
list_put(L);
list_zxg(L,'f','e');
list_put(L);
list_px(L);
list_put(L);
list_length(L);
list_free(L);
return 0;
}
/**********************************函数封装***************************/
#include "main.h"
//创建
linklistptr list_create()
{
linklistptr L=(linklistptr)malloc(sizeof(node));
if(NULL==L)
{
printf("创建失败\n");
return NULL;
}
L->len=0;
L->next=NULL;
printf("创建成功\n");
return L;
}
//判空
int list_empty(linklistptr L)
{
if(NULL==L)
{
printf("链表不合法\n");
return -1;
}
return L->next ==NULL;
}
//申请节点
linklistptr node_buy(datatype e)
{
linklistptr p=(linklistptr)malloc(sizeof(node));
if(NULL==p)
{
printf("申请失败\n");
}
p->data =e;
p->next =NULL;
return p;
}
//头插
int list_insert_head(linklistptr L,datatype e)
{
if(NULL==L)
{
printf("所给链表不合法\n");
return 0;
}
linklistptr p =node_buy(e);
if(NULL==p)
{
return 0;
}
p->next = L->next;
L->next=p;
L->len++;
printf("插入成功\n");
return 1;
}
//遍历
void list_put(linklistptr L)
{
if(NULL==L||list_empty(L))
{
printf("遍历失败\n");
return ;
}
linklistptr q =L->next;
while(q!=NULL)
{
printf("%c\t",q->data);
q = q->next;
}
putchar(10);
}
//按位置查找返回节点
linklistptr list_search_pos(linklistptr L,int pos)
{
if(NULL==L||list_empty(L)||pos<0||pos>L->len)
{
printf("查找失败\n");
return NULL;
}
linklistptr q =L;
for(int i=0;i
q = q->next;
}
return q;
}
//任意位置插入
int list_add(linklistptr L,int pos,datatype e)
{
if(NULL==L||pos<1||pos>L->len+1)
{
printf("插入失败\n");
return 0;
}
linklistptr p = node_buy(e);
if(NULL==p)
{
return 0;
}
linklistptr q =list_search_pos(L,pos-1);
p->next=q->next;
q->next=p;
L->len++;
printf("插入成功\n");
return 1;
}
//尾插/
int list_insert_tail(linklistptr L,datatype e)
{
if(NULL==L)
{
printf("插入失败\n");
}
linklistptr p = node_buy(e);
if(NULL==p)
{
return 0;
}
linklistptr q =list_search_pos(L,L->len);
p->next=q->next;
q->next=p;
L->len++;
printf("尾插插入成功\n");
return 1;
}
//头删
int list_delete_head(linklistptr L)
{
if(NULL==L||list_empty(L))
{
printf("删除失败\n");
return 0;
}
linklistptr p = L->next;
L->next=p->next;
free(p);
p=NULL;
L->len--;
printf("删除成功\n");
return 1;
}
//尾删
int list_delete_tail(linklistptr L)
{
if(NULL==L||list_empty(L))
{
printf("删除失败\n");
return 0;
}
linklistptr q =list_search_pos(L,L->len-1);
linklistptr p =q->next;
q->next=NULL;
free(p);
p=NULL;
L->len--;
printf("删除成功\n");
return 1;
}
//任意位置删除
int list_delete_pos(linklistptr L,int pos)
{
if(NULL==L||list_empty(L)||pos<1||pos>L->len)
{
printf("删除失败\n");
return 0;
}
linklistptr q =list_search_pos(L,pos-1);
linklistptr p =q->next;
q->next=p->next;
free(p);
p=NULL;
L->len--;
printf("删除成功\n");
return 1;
}
//按值查找
int list_search_vlaue(linklistptr L,datatype e)
{
if(NULL==L||list_empty(L))
{
printf("查找失败\n");
return 0;
}
for(int i=0;i
{
if(list_search_pos(L,i)->data==e)
{
return i;
}
}
return 0;
}
//按位置修改
int list_xg(linklistptr L,int pos,datatype e)
{
if(NULL==L||list_empty(L)||pos<0||pos>L->len)
{
printf("修改失败\n");
return 0;
}
linklistptr p=list_search_pos(L,pos);
p->data=e;
printf("修改成功\n");
return 1;
}
//按值修改
int list_zxg(linklistptr L,datatype a,datatype e)
{
if(NULL==L||list_empty(L))
{
printf("修改失败\n");
return 0;
}
for(int i=1;i
{
linklistptr p=list_search_pos(L,i);
if(p->data==a)
{
p->data=e;
}
}
printf("修改成功\n");
}
//链表的排序
void list_px(linklistptr L)
{
if(NULL==L||list_empty(L))
{
printf("排序失败\n");
}
for(int i=1;i
{
datatype e=0;
for(int j=1;j
{
linklistptr p=list_search_pos(L,j);
if(p->data>p->next->data)
{
e=p->data;
p->data=p->next->data;
p->next->data=e;
}
}
}
printf("排序成功\n");
}
//链表的反转
void list_reverse(linklistptr L)
{
if(NULL==L||list_empty(L)||L->len<=1)
{
printf("反转失败\n");
}
linklistptr h = L->next;
L->next=NULL;
linklistptr p;
while(h!=NULL)
{
p=h;
h=h->next;
p->next=L->next;
L->next=p;
}
printf("反转后\n");
}
//链表的返回长度
int list_length(linklistptr L)
{
if(NULL==L||list_empty(L))
{
printf("返回失败\n");
return -1;
}
return L->len;
}
//链表的销毁
void list_free(linklistptr L)
{
if(NULL==L)
{
printf("释放失败\n");
}
while(L->next!=NULL)
{
list_delete_head(L);
}
free(L);
L=NULL;
printf("释放成功\n");
}
/*********************************************头文件********************/
#ifndef _MAIN_H_
#define _MAIN_H_
#include
#include
#include
typedef char datatype;
typedef struct node
{
union
{
datatype data;
int len;
};
struct node *next;
}node,*linklistptr;
//创建
linklistptr list_create();
//判空
int list_empty(linklistptr L);
//申请节点
linklistptr node_buy(datatype e);
//头插
int list_insert_head(linklistptr L,datatype e);
//遍历
void list_put(linklistptr L);
//按位置查找返回节点
linklistptr list_search_pos(linklistptr L,int pos);
//尾插
int list_insert_tail(linklistptr L,datatype e);
//任意位置插入
int list_add(linklistptr L,int pos,datatype e);
//头删
int list_delete_head(linklistptr L);
//尾删
int list_delete_tail(linklistptr L);
//任意位置删除
int list_delete_pos(linklistptr L,int pos);
//按值查找
int list_search_vlaue(linklistptr L,datatype e);
//按位置修改
int list_xg(linklistptr L,int pos,datatype e);
//按值修改
int list_zxg(linklistptr L,datatype a,datatype e);
//链表的排序
void list_px(linklistptr L);
//链表的反转
void list_reverse(linklistptr L);
//链表的返回长度
int list_length(linklistptr L);
//链表的销毁
void list_free(linklistptr L);
#endif