linklist.h //头文件:数据 及 函数的声明
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include <stdio.h>
#include <stdlib.h>
typedef int datatype; //链表中存储的数据类型可以在头文件中规定好,后续如果需要更改链表中存储的数据类型,直接修改这里的数据类型即可。此处以 int 型为例。
typedef struct node{ //单链表很简单,每个节点两个数据成员:需要存储的数据 和 紧跟该节点后面的一个节点的地址
datatype data;
struct node *next;
}listnode,*linklist;
extern linklist list_create(); //单链表的创建
extern linklist list_create2(); //单链表的创建(功能同上)
extern int list_head_insert(linklist H,datatype value); //新建数据节点并且插入到头结点的后面
extern int list_insert(linklist H,int pos,datatype value); //新建数据节点按照指定位置(pos)插入到链表中
extern int list_delete(linklist H,int pos); //删除链表中指定位置的节点
extern linklist list_get(linklist H,int pos); //获取链表中指定位置的节点
extern linklist list_locate(linklist H,datatype value); //获取链表中数据等于value的第一个节点
extern void list_reverse(linklist H); //链表倒置(逆序)
extern void list_show(linklist H); //链表节点数据显示(遍历)
extern int list_order_insert(linklist H,datatype value); //单链表的有序插入(从小到大排列)
extern void list_sort(linklist H); //单链表重新排序(从小到大排序)
extern void list_free(linklist H); //释放单链表
#endif
linklist.c //函数的具体实现,可根据自己的需要适当的添加 或 修改函数
#include "linklist.h"
linklist list_create() //单链表的创建
{
linklist H;
if((H=(linklist)malloc(sizeof(listnode)))==NULL)
{
printf("malloc failed!\n");
return H;
}
H->data = 0;
H->next = NULL;
return H;
}
linklist list_create2() //单链表的创建(功能同上一个函数)
{
linklist H,r,p;
int value;
if((H=(linklist)malloc(sizeof(listnode)))==NULL)
{
printf("malloc failed!\n");
return H;
}
H->data = 0;
H->next = NULL;
r=H;
while(1)
{
printf("input a number(-1 exit):");
scanf("%d",&value);
if(value == -1)
break;
if((p=(linklist)malloc(sizeof(listnode)))==NULL)
{
printf("malloc failed\n");
return H;
}
p->data = value;
p->next = NULL;
r->next = p;
r=p;
}
return H;
}
int list_head_insert(linklist H,datatype value) //新建数据节点并且插入到头结点的后面
{
linklist p;
if((p=(linklist)malloc(sizeof(listnode)))==NULL)
{
printf("malloc failed\n");
return -1;
}
p->data = value;
p->next = H->next;
H->next = p;
return 0;
}
int list_insert(linklist H,int pos,datatype value) //新建数据节点按照指定位置(pos)插入到链表中
{
linklist p,q;
if(pos==0)
p=H;
else
p=list_get(H,pos-1);
if(p==NULL)
{
printf("para is invalid\n");
return -1;
}
else
{
if((q=(linklist)malloc(sizeof(listnode)))==NULL)
{
printf("malloc failed\n");
return -1;
}
q->data = value;
q->next = p->next;
p->next = q;
return 0;
}
}
int list_delete(linklist H,int pos) //删除链表中指定位置的节点
{
linklist p,q;
if(pos == 0)
p=H;
else
p=list_get(H,pos-1);
if(p==NULL || p->next==NULL)
{
printf("para is invalid\n");
return -1;
}
else
{
q=p->next;
p->next=q->next;
free(q);
q=NULL;
return 0;
}
}
linklist list_get(linklist H,int pos) //获取链表中指定位置的节点
{
linklist p=H;
int i=-1;
if(pos<0)
{
printf("position is invalid:<0\n");
return NULL;
}
while(p->next && i<pos)
{
p=p->next;
i++;
}
//if(p->next)
if(i==pos)
{
return p;
}
else
{
printf("position is invalid: > length\n");
return NULL;
}
}
linklist list_locate(linklist H,datatype value) //获取链表中数据等于value的第一个节点
{
linklist p=H->next;
while(p&&p->data !=value)
{
p=p->next;
}
return p;
}
void list_reverse(linklist H) //链表倒置(逆序)
{
linklist p,q;
p=H->next;
H->next = NULL;
while(p)
{
q=p;
p=p->next;
q->next = H->next;
H->next = q;
}
}
int list_order_insert(linklist H,datatype value) //单链表的有序插入(从小到大排列)
{
linklist p,q;
if((p=(linklist)malloc(sizeof(listnode)))==NULL)
{
printf("malloc faied\n");
return -1;
}
p->data = value;
q=H;
while(q->next&&q->next->data < value)
{
q=q->next;
}
p->next = q->next;
q->next = p;
return 0;
}
void list_show(linklist H) //链表节点数据显示(遍历)
{
while(H->next)
{
printf("%d ",H->next->data);
H = H->next;
}
printf("\n");
}
void list_sort(linklist H) //单链表重新排序(从小到大排序)
{
linklist p,q,r;
p=H->next;
H->next = NULL;
while(p)
{
q=p;
p=p->next;
r=H;
while(r->next && r->next->data < q->data)
r=r->next;
q->next = r->next;
r->next = q;
}
}
void list_free(linklist H) //释放单链表
{
linklist p,q;
p = H->next;
while(p)
{
q = p->next;
free(p);
p = q;
}
free(H);
}