C语言单链表(线性表的链式存储)实现代码

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);
}


猜你喜欢

转载自blog.csdn.net/weixin_39148042/article/details/80958177