单链表和双向循环链表的创建、初始化、以插入(二)

对于双向循环链表的创建可从下图理解:

由上图可清晰的知道双向循环链表的结构,即对于一个newNode插入链表是首先应该将newNode的prev指向current,即newNode->prev=current;再将newNode的next指向current的next;
即newNode->next=current->next;再将current的之前的下一个元素即15所指代的结构体指向newNode即current->next-》prev=newNode; 最后再将current的next指向newNode;current->next=newNode;
 

双向
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>

typedef int elemType;

typedef struct node
{
	elemType number;
	struct node *prev, *next;
	
}lnode,*listNode;

void initNode(listNode & head)
{
	head = (listNode)malloc(sizeof(lnode));
	head->number = 0;
	head->next = head->prev = head;
}
void createList(listNode &head)
{
	listNode pNode,temp;
	pNode = (listNode)malloc(sizeof(lnode));
//	scanf("%d", pNode->number);
	pNode = head;
	
	temp = (listNode)malloc(sizeof(lnode));
	scanf("%d",&temp->number);

	while (temp->number != -1)
	{
		if (head->next == head)
		{
			temp->next = head;
			pNode->next = temp;
			head->prev = temp;
			temp->prev = pNode;

		}
		else
		{
			temp->next = pNode->next;
			temp->prev = pNode;
			pNode->next->prev = temp;
			pNode->next = temp;
		}
		pNode = temp;
		temp = (listNode)malloc(sizeof(lnode));
		scanf("%d", &temp->number);
		
		
	}

}

int topInsertList(listNode &head,listNode &tNode)
{
	if (head ->next==head)
	{
		tNode->next = head;
		tNode->prev = head;
		head->next = tNode;
		head->prev = tNode;
	}
	else
	{
		
		tNode->next = head->next;
		tNode->prev = head;
		head->next = tNode;
		head->next->prev = tNode;
	}
	return 0;
}
void tailInsertList(listNode & head,listNode tNode)
{
	listNode node;
	node = head;
	while (node->next!=head)
	{
		node=node->next;
	}
	if (node->next == head)
	{
		head->prev->next = tNode;
		head->prev = tNode;
		tNode->prev = head->prev;
		tNode->next = head;	
		
	}
	
}
void printList(listNode head)
{
	if (head == NULL)
	{
		exit(2);
	}
	listNode node;
	node = head;
	while (node->next != head)
	{
		printf("%d ",node->number);
		node = node->next;
	}
	printf("%d", node->number);
	printf("\n");
}
int main()
{
	listNode tphead,newNode,newNode1;
	initNode(tphead);
	createList(tphead);
	printList(tphead);
	initNode(newNode);
	newNode->number = 99;
	topInsertList(tphead,newNode);
	printList(tphead);
	initNode(newNode1);
	newNode1->number = 111;
	tailInsertList(tphead,newNode1);
	printList(tphead);
	system("pause");
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值