头文件
#ifndef _LINK_H_
#define _LINK_H_
#include <stdio.h>
#include <stdlib.h>
typedef int data_t;
typedef struct link{
data_t data;
struct link *next;
}link_node,*link_pnode;
//创造头节点
link_pnode create_lk();
//判空
int empty_lk(link_pnode head);
//求长度
int len_lk(link_pnode head);
//插入
int insert_lk(link_pnode head,int pos,data_t data);
//删除
int delete_lk(link_pnode head,int pos);
//打印
int show_lk(link_pnode head);
//清空
int clear_lk(link_pnode head);
//摧毁
int destory_lk(link_pnode *head);
//倒序
int revers_lk(link_pnode head);
//从小到大排序
int sort_link(link_pnode head);
//插入排序
int insert_order_lk(link_pnode head,data_t data);
#endif
功能函数
#include "link.h"
//创造头节点
link_pnode create_lk()
{
link_pnode head = (link_pnode)malloc(sizeof(link_node));
if(NULL == head){
perror("malloc");
return 0;
}
head->next = NULL;
return head;
}
//判空
int empty_lk(link_pnode head)
{
return head->next == NULL;
}
//求长度
int len_lk(link_pnode head)
{
int len=0;
link_pnode p=head->next;
while(p){
len++;
p=p->next;
}
return len;
}
//插入
int insert_lk(link_pnode head,int pos,data_t data)
{
if(pos < 0 || pos > len_lk(head))//判断插入的位置
{
printf("pos is error\n");
return -1;
}
link_pnode p,q;
q=(link_pnode)malloc(sizeof(link_node)); //创建新节点
q->data = data; //给新节点赋值
p=head; //定义一个指针,让其指向所插入位置的前一个节点
while(pos--){
p=p->next;
}
q->next = p->next; //断开旧连接,插入新节点
p->next = q;
return 0;
}
//删除
int delete_lk(link_pnode head,int pos)
{
if(1 == empty_lk(head))
{
printf("head is empty\n");
return 0;
}
if(pos < 0 || pos > len_lk(head))
{
printf("pos is error\n");
return -1;
}
link_pnode p = head;
link_pnode q;
while(pos--){ //定义一个指针,让其指向被删除位置的前一个位置
p = p->next;
}
q = p->next;
p->next = q->next;
printf("删除--%d\n",q->data);
free(q);
}
//打印
int show_lk(link_pnode head)
{
if(1 == empty_lk(head))
{
printf("head is empty\n");
return 0;
}
link_pnode p=head->next;
while(p){
printf("%d-->",p->data);
p=p->next;
}
printf("NULL\n");
}
//清空
int clear_lk(link_pnode head)
{
while(head->next != NULL) //一直删除第0位的节点,直至删除头节点外的所有节点
{
delete_lk(head,0);
}
printf("清空完毕\n");
return 0;
}
//摧毁
int destory_lk(link_pnode *head)
{
clear_lk(*head);
free(*head);
*head = NULL;
return 0;
}
//倒序
int revers_lk(link_pnode head) //断开头节点,让后续的链依次断开,然后在头节点后插入
{
if(1 == empty_lk(head))
{
printf("head is empty\n");
return 0;
}
link_pnode p,q;
q = head->next;
head->next = NULL;
while(q != NULL){
p = q;
q = q->next;
p->next = head->next;
head->next = p;
}
return 0;
}
//从小到大排序
int sort_link(link_pnode head)
{
if(1 == empty_lk(head))
{
printf("head is empty\n");
return 0;
}
link_pnode p,q,r;
q = head->next;
head->next = NULL;
while(q != NULL){
p=q;
r=head;
q=q->next;
while(r->next != NULL && r->next->data < p->data)
r=r->next;
p->next = r->next;
r->next = p;
}
return 0;
}
//插入排序
int insert_order_lk(link_pnode head,data_t data)
{
link_pnode p,r;
p=(link_pnode)malloc(sizeof(link_node));
if(NULL == p){
perror("malloc");
return 0;
}
p->data = data;
r=head;
while(r->next != NULL && r->next->data < data){
r=r->next;
}
p->next = r->next;
r->next = p;
return 0;
}