实现双向链表的创建、测长、打印、插入、删除

实例实现双向链表的创建、测长、打印、插入、删除:

<span style="font-size:18px;">//dbList.h文件

typedef struct student
{
	int data;
	struct student *next;
	struct student *pre;
}dnode;


typedef dnode * dbList;
typedef dnode * dbPosition;

//建立双链表
dbList Create();

//双链表测长
int Length (dbList L);

//双链表的打印
void Print(dbList L);

//双链表删除结点
dbList Delete(dbList L, int num);

//双链表插入某个结点
dbList Insert(dbList L,int num);
</span>

<span style="font-size:18px;">//dbList.cpp文件

#include <iostream>
#include <stdio.h>
#include <string>
#include <conio.h>

using namespace std;


#include "doubleList.h"

/************************************************************************/
/* 功能:编程实现一个双链表的建立(只有头指针,没有头结点)             */
/* 参数:无                                                             */
/* 返回:链表的头指针                                                   */
/************************************************************************/
dbList Create()
{
	dbList head,p,s;
	int x,cycle = 1;
	head = (dbList)malloc(sizeof(dnode));
	p= head;
	while(cycle)
	{
		printf("\nPlease input the data: ");
		scanf("%d",&x);
		if(x != 0)
		{
			s = (dbList)malloc(sizeof(dnode));
			s->data = x;
			printf("\n      %d",s->data);
			p->next = s;
			s->pre = p;
			p = s;
		}
		else
			cycle = 0;
	}
	head = head->next;
	head->pre = NULL;
	p->next = NULL;

	return head;
}


/************************************************************************/
/* 功能:编程实现一个双链表的测长                                       */
/* 参数:双链表的头指针                                                 */
/* 返回:双链表的长度                                                   */
/************************************************************************/
int Length( dbList L )
{
	int n = 0;
	dbList p;
	p = L;
	while(p != NULL)
	{
		p = p->next;
		n++;
	}
	return n;
}

/************************************************************************/
/* 功能:编程实现一个双链表的打印                                       */
/* 参数:双链表的头指针                                                 */
/* 返回:无                                                             */
/************************************************************************/
void Print( dbList L )
{
	dbList p;
	int n = Length(L);
	printf("\nNow,These %d Records are ",n);
	p = L;
	while(p != NULL)
	{
		printf("\n     %d  \n",p->data);
		p = p->next;
	}
}

/************************************************************************/
/* 功能:编程实现双链表删除一个结点                                     */
/* 参数:L:双链表的头指针   num:删除该数据所在的结点保存的值          */
/* 返回:双链表的头指针                                                 */
/************************************************************************/
dbList Delete( dbList L, int num )
{
	dbList p;
	p = L;
	while(p->data != num && p->next != NULL)
		p = p->next;
	if(p->data == num)
	{
		if(p == L)      //需要删除的是第一个结点
		{
			L= p->next;
			L->pre = NULL;
			free(p);
		}
		else if(p->next == NULL)    //需要删除的是最后一个结点
		{
			p->pre->next = NULL;
			free(p);
		}
		else                        //需要删除的是中间的某个节点
		{
			p->pre->next = p->next;
			p->next->pre = p->pre;
			free(p);
		}
		
	}
	else
	{
		printf(("\n%d could not been found \n"),num);
	}
	return L;
}

/************************************************************************/
/* 功能:编程实现在链表中插入一结点,插入的位置由从小到大排序决定       */
/* 参数:L 指向链表的头指针   num:指定插入的数据值                      */
/* 返回:指向头结点的指针                                               */
/************************************************************************/
dbList Insert( dbList L,int num )
{
	dbList p0,p1;
	p0 = (dbList)malloc(sizeof(dbList));
	p0->data = num;
	p1 = L;
	while(p0->data >p1->data && p1->next != NULL)
	{
		p1 = p1->next;
	}
	if(p0->data <= p1->data)
	{
		if(p1 == L)       //插入到最前面去
		{
			p0->next = p1;
			p1->pre =p0;
			L = p0;
		}
		else             //插在中间的某个位置
		{
			p1->pre->next = p0;
			p0->pre = p1->pre;
			p0->next = p1;
			p1->pre = p0;
		}
	}
	else                 //插在最后的位置(num值大于所有结点数据) 
	{
		p1->next = p0;
		p0->pre = p1;
		p0->next = NULL;
	}
	return L;
}


int main()
{
	dbList L;
	L = Create();
	Print(L);
	Delete(L,5);
	Print(L);
	Insert(L,10);
	Print(L);
	return 0;
}</span>

程序输入/ 输出:



猜你喜欢

转载自blog.csdn.net/dby3579/article/details/52036421