⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linklist.c

📁 在linux平台下模拟超市的收银系统即POS机
💻 C
字号:
#include <string.h>#include <stdlib.h>#include "linklist.h"//注意我的链表是以下标1开始的//初始化链表只是为链表结构体分配空间,并把成员指针为空void  link_init(LINKLIST *linklist){	linklist->head=NULL;	linklist->rearptr=NULL;	linklist->curptr=NULL; // 当前结点	linklist->count=0;}//插入链表尾部时只是判断是否是空链表void insert_rear_link(LINKLIST *linklist,void *data){	NODE * node=create_node(data);	if(linklist->rearptr!=NULL)	{		linklist->rearptr->next=node;		node->prior=linklist->rearptr;		linklist->rearptr=node;	}	else	{		linklist->head=node;  //将头结点指向node		linklist->rearptr=node;//将尾结点指向node	}	linklist->curptr=node;//当前结点指向新创建的结点	linklist->count++;}void  insert_front_link(LINKLIST *linklist,void *data){	NODE * node=create_node(data);	if(linklist->head!=NULL)	{		linklist->head->prior=node;		node->next=linklist->head;		linklist->head=node;	}	else	{		linklist->head=node;  //将头结点指向node		linklist->rearptr=node;//将尾结点指向node	}	linklist->curptr=node;//当前结点指向新创建的结点	linklist->count++;}NODE *create_node(void *data){	NODE * node=(NODE*)malloc(sizeof(NODE));
	if(data!=NULL)	{
		node->node_data=data;
	}else
	{
		node->node_data=NULL;
	}	node->prior=NULL; //前驱	node->next=NULL; //后驱	return node;}/*根据下标插入链表中:首先取得下标结点然后保存起来,然后对该结点next字段改我新加入结点	新加入结点prior字段改为保存起来的结点。*/void insert_link_index(LINKLIST *linklist,int index,void *data){	if(index==1) //即在头结点位置插入一个新结点	{		insert_front_link(linklist,data);	}	else if(index==linklist->count)  //当在尾结点位置插入一个新结点时 	{		NODE * node=create_node(data);		if(linklist->rearptr!=NULL)		{			linklist->rearptr->prior->next=node;			node->prior=linklist->rearptr->prior;			node->next=linklist->rearptr;			linklist->rearptr->prior=node;		}		else		{			linklist->head=node;  //将头结点指向node			linklist->rearptr=node;//将尾结点指向node		}		linklist->curptr=node;//当前结点指向新创建的结点		linklist->count++;	}	else	{				NODE * node = create_node(data); // 创建一个要插入的新节点		/*		int i=1;		NODE * pNode=linklist->head;//把头节点指针保存进一个临时指针中		while(i<index)		{			pNode=pNode->next;			i++;		}		*/		NODE * pNode=get_node_by_index(linklist,index);//获取要插入位置的节点指针		if(pNode!=NULL)		{			pNode->prior->next=node;			node->prior=pNode->prior;			node->next=pNode;			pNode->prior=node;			linklist->curptr=node;//当前结点指向新创建的结点		    linklist->count++;//结点个数加一		}	}}//获取指定索引值的节点NODE *get_node_by_index(LINKLIST *linklist,int index){	int i=1;	NODE * node=linklist->head;	if(index>0 && index <=linklist->count)	{		while(i<index)		{			node=node->next;			i++;		}		return node;	}	return NULL;}//删除指定节点 void del_link_index(LINKLIST *linklist,int index){	//删除头节点 	if(index==1)	{		del_head_link(linklist);	}	else if(index==linklist->count)//删除尾节点 	{		del_rear_link(linklist);	}	else	{		NODE * pNode=get_node_by_index(linklist,index);//获取要删除位置的节点指针		if(pNode!=NULL)		{			pNode->prior->next=pNode->next;			pNode->next->prior=pNode->prior;			free_node(pNode); //删除指定节点 			linklist->count--; //节点总数减一		}	}	//如查删任意节点完没有节点,那么要再把链表列表清空 	if(linklist->count==0)	{        link_init(linklist);    }} //删除所有节点void free_all_node(LINKLIST *linklist){	NODE *pNODE; //临时指针用来存放下一个节点	while(linklist->head!=NULL)	{		pNODE=linklist->head->next;//将下一下节点保存起来		//free(linklist->head);//删掉头节点		free_node(linklist->head);//掉头节点		linklist->head=pNODE;//再把头节点指向下一个节点	}	link_init(linklist);}//删除链表void  free_list(LINKLIST *linklist){	free_all_node(linklist);	link_init(linklist);}//删除尾节点void  del_rear_link(LINKLIST *linklist){	if(linklist->rearptr!=NULL)	{        NODE * pNode=linklist->rearptr->prior; //保存尾节点的前驱节点 		pNode->next=NULL;//把尾节点的前驱节点中的next设为NULL 		//free(linklist->rearptr);		free_node(linklist->rearptr); //删除尾节点 		linklist->rearptr=pNode; //将尾指针指向尾节点的前驱节点 		linklist->count--;//节点的个数减一 	}	//如查删尾节点完没有节点,那么要再把链表列表清空 	if(linklist->count==0)	{        link_init(linklist);    }}//删除头节点 void del_head_link(LINKLIST *linklist){	if(linklist->head!=NULL)	{
		//如果头节点等于尾节点即只有一个节点的时候就直接删掉
		if(linklist->head==linklist->rearptr)
		{
			free_node(linklist->head);
		}
		else        {
			NODE * pNode=linklist->head->next; //保存头节点的后驱节点 			pNode->prior=NULL;//把头节点的后驱节点中的prior设为NULL 			//free(linklist->rearptr);			free_node(linklist->head); //删除头节点 			linklist->head=pNode; //将尾指针指向尾节点的前驱节点  		}
		linklist->count--;//节点的个数减一	}	//如查删尾节点完没有节点,那么要再把链表列表清空 	if(linklist->count==0)	{        link_init(linklist);    }}//释放指定的节点void free_node(NODE *node){	//node->prior->next=node->next;	//node->next->prior=node->prior;	if(node!=NULL)	{        if(node->node_data!=NULL)	   {		free(node->node_data);	   }	   free(node);//释放节点    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -