189 8069 5689

C语言-双链表的实现-创新互联

双链表的实现 使用指针与结构体实现一个双向链表 1.头文件
#ifndef _SLINK_H
#define _SLINK_H

typedef int data_type;

typedef struct dblinknode
{data_type data;
	struct dblinknode *pre;
	struct dblinknode *next;

}DBLinkNode;

enum res
{MALLOCERROR=-3,
	POSSERROR,
	DBLINKNULL,
	OK
};
enum op
{TAIL = -1,
	HEAD
};
//创建
DBLinkNode *create(void);
//插入
int insert(DBLinkNode *pHead,int pos,data_type item);

int delete(DBLinkNode *pHead,int pos,data_type *pData);

int show(DBLinkNode *pHead);

#endif
2.创建函数

首先需要创建一个头节点,之后的函数大部分都需要此头节点的地址

专注于为中小企业提供网站设计、网站制作服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业薛城免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了近千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
DBLinkNode *create(void)
{DBLinkNode *pHead=NULL;
	pHead=(DBLinkNode *)malloc(sizeof(DBLinkNode));
	if(pHead==NULL)
	{perror("malloc error");
		return MALLOCERROR;
	}
	memset(pHead,0,sizeof(DBLinkNode));
	return pHead;
}
3.插入函数

分为有插入,尾插入和中间插入

int insert(DBLinkNode *pHead,int pos,data_type item)
{if(pHead==NULL)
	{return DBLINKNULL;
	}
	if(pos<0)
	{return POSSERROR;
	}
	DBLinkNode *pTmp=NULL;
	DBLinkNode *pNew=NULL;
	pNew=(DBLinkNode *)malloc(sizeof(DBLinkNode));
	if(pNew==NULL)
	{return MALLOCERROR;
	}
	memset(pNew,0,sizeof(DBLinkNode));
	pNew->data=item;
	pTmp=pHead;
	int i;
	switch(pos - 1)
	{case HEAD:
			pNew->next=pHead->next;
			pNew->pre=pHead;
			if(pHead->next!=NULL)
			{		pHead->next->pre=pNew;
			}
			pHead->next=pNew;
			break;
		case TAIL:
			if(pTmp->next==NULL)
			{		return DBLINKNULL;
			}
			while(pTmp->next!=NULL)
			{		pTmp=pTmp->next;
			}
			pTmp->next=pNew;
			pNew->pre=pTmp;
			break;
		default:
			for(i=1;i<=pos-1;i++)
			{		pTmp=pTmp->next;
			}
			pNew->next=pTmp->next;
			pNew->pre=pTmp;
			if(pTmp->next!=NULL)
			{	pTmp->next->pre=pNew;
			}
			pTmp->next=pNew;
	}
	return OK;
}
4.删除函数

删除也分为头删除,尾删除,中间删除

int delete(DBLinkNode *pHead,int pos,data_type *pData)
{if(pHead==NULL)
	{return DBLINKNULL;
	}
	if(pos<0)
	{return POSSERROR;
	}
	DBLinkNode *pTmp=NULL;
	DBLinkNode *pDel=NULL;
	pTmp=pHead;
	pDel=pHead->next;
	int i=1;
	switch(pos-1)
	{case HEAD:
		*pData=pDel->data;
		pDel->next->pre=pTmp;
		pHead->next=pDel->next;
		free(pDel);
		pDel=NULL;
		break;
	case TAIL:
		if(pDel==NULL)
		{	return DBLINKNULL;
		}
		while(pDel->next!=NULL)
		{	pTmp=pDel;
			pDel=pDel->next;
		}
		*pData=pDel->data;
		pTmp->next=NULL;
		pDel->pre=NULL;
		free(pDel);
		pDel=NULL;
		break;
	default:
	while((i<=pos-1)&&(pDel!=NULL))
	{pTmp=pDel;
		pDel=pDel->next;
		i++;
	}
	if(pDel==NULL)
	{return DBLINKNULL;
	}
	*pData=pDel->data;
	pDel->next->pre=pTmp;
	pTmp->next=pDel->next;
	free(pDel);
	pDel=NULL;
	}
5.展示函数

传入头节点,遍历打印取出节点数据域中的值

int show(DBLinkNode *pHead)
{if(pHead==NULL)
	{return DBLINKNULL;
	}
	DBLinkNode *pTmp=NULL;
	pTmp=pHead->next;
	while(pTmp->next!=NULL)
	{printf("%d ",pTmp->data);
		pTmp=pTmp->next;
	}
	printf("%-5d",pTmp->data);
	return OK;
}
6.主函数
#include#include#include#include"../include/slink.h"

void menu(void)
{printf("1.......insert\n");
	printf("2.......show\n");
	printf("3.......delete\n");
	printf("4........update\n");
	printf("-1........exit\n");
}

int main(void)
{DBLinkNode *pHead=NULL;
	pHead=create();
	int pos=0;
	int op=0;
	int ret=0;
	data_type item;
	while(1)
	{menu();
		printf("请输入选项:\n");
		scanf("%d",&op);
		if(op==-1)
		{	break;
		}
		switch(op)
		{case 1:
			printf("请输入要插入的位置和元素:\n");
			scanf("%d%d",&pos,&item);
			ret=insert(pHead,pos,item);
			if(ret==OK)
			{		printf("插入成功\n");
			}
			if(ret==POSSERROR)
			{		printf("插入位置错误\n");
			}
			break;
		case 2:
			show(pHead);
			break;
		case 3:
			printf("请输入要删除的位置:\n");
			scanf("%d",&pos);
			ret=delete(pHead,pos,&item);
			printf("删除的元素是:%d",item);
			break;
		case 4:
			break;
		case 6:
			break;
		}
	}
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


新闻名称:C语言-双链表的实现-创新互联
分享路径:http://cdxtjz.com/article/shidi.html

其他资讯