数据结构—双链表的操作

/**
  * @brief   双链表的初始化,建立,插入,查找,删除
  * @author  ranqy374
  * @date    2013.6.26
  */

#include <stdio.h>
#include <stdlib.h>

//双链表结点类型的定义
typedef struct Node {
	int data;
	struct Node *prior;
	struct Node *next;
}DLNode;
//尾插法建立双链表,版本1
DLNode *rearCreateList1()
{
	int i;
	DLNode *head, *rear;
	head = (DLNode *)malloc(sizeof(DLNode));//申请头结点
	head->next = NULL;

	rear = head;	//rear 为指向终端结点的指针 

	int t[5] = { 5, 6, 9, 10, 12 };	//利用尾插法建立一个以数组t的元素为结点的双链表
	for ( i = 0; i < 5; ++i ) {
		DLNode *p;		//要添加的结点
		p = (DLNode *)malloc(sizeof(DLNode));

		p->data = t[i];
		rear->next = p;
		p->prior = rear;
		rear = p;
	}
	rear->next = NULL;
	return head;
}


//双链表的插入,在双链表中的第i个位置插入值为x的元素
int insertList(DLNode *head, int i, int x)
{
	int index = 1;
	
	if ( head == NULL || i < 1 )
		return 0;		//如果双链表为空 或 要添加的结点索引号为0,返回
	while ( head->next && index < i ) {
		head = head->next;
		index++;
	}
	if ( head->next == NULL )
		return 0;		//如果要添加的结点的位置超出双链表的表尾,返回

	DLNode *p = (DLNode *)malloc(sizeof(DLNode));//创立新结点
	p->data = x;

	p->next = head->next;
	p->prior = head;	
	head->next = p;
	head->next->prior = p;
	return 1;
}

//双链表的删除,删除双链表中第i个结点
int deleteList(DLNode *head, int i)
{
#if 0
	int index = 0; 	
	if ( head == NULL || i < 1 )
		return 0;		//如果双链表为空 或 要删除的结点为0,返回
	while ( head->next && index < i ) {
		head = head->next;
		index++;
	}
	if ( head->next == NULL )
		return 0;		//如果要删除的结点不在双链表里,返回
	head->prior->next = head->next;
	head->next->prior = head->prior;
	free(head);
	return 1;
#endif
	int index = 1; 	
	if ( head == NULL || i < 1 )
		return 0;		//如果双链表为空 或 要删除的结点为0,返回
	while ( head->next && index < i ) {
		head = head->next;
		index++;
	}
	if ( head->next == NULL )
		return 0;		//如果要删除的结点不在双链表里,返回
	DLNode *deleteNode = head->next;	//要删除的结点
	deleteNode->prior->next = deleteNode->next;
	deleteNode->next->prior = deleteNode->prior;
	free(deleteNode);
	return 1;
}

//打印输出双链表里面的元素
void printDLink(DLNode *head)
{
	while ( head->next ) {
		head = head->next;
		printf("%d ", head->data);
	}
	printf("\n");
}

int main()
{
	int choice = 0;
	int deleteIndex = 0;	//要删除的链表结点的索引号
	int insertIndex = 0;	//要添加的链表结点的索引号
	int insertElement = 0;	//要添加的结点元素
	DLNode *head = (DLNode *)malloc(sizeof(DLNode));

	printf("1.creat\n");  
	printf("2.delete\n");  
	printf("3.insert\n");  
	//printf("4.reverse\n");  
	//printf("5.commonNode\n");  
	//printf("6.createLoop\n");  
	//printf("7.judgeLoop\n");
	printf("0.exit\n");  

	while ( 1 ) {
		printf("please input your choice:");
		scanf("%d", &choice);

		switch (choice) {
		case 1 :
			head = rearCreateList1();
			printDLink(head);
			break;
		case 2 :
			//head = rearCreateList1();
			printf("input num of delete:");
			scanf("%d", &deleteIndex);
			deleteList(head, deleteIndex);
			printDLink(head);
			break;
		case 3 :
			printf("input the num and element of insert:");
			scanf("%d %d", &insertIndex, &insertElement);
			insertList(head, insertIndex, insertElement);
			printDLink(head);
			break;
		case 0 : exit(0); break;
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值