C语言双链表的创建

         实际中经常会用到双链表的地方,在此简单搭建了一个双链表创建双链表的程序。由于代码简单明了在此就不赘述双链表的创建过程描述,加之代码中有注解,那就直接见代码。

    

#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;

typedef struct List
{
	int Data;
	struct List *Pre;//前驱
	struct List *Next;//后驱
}ListNode, *ListNodeP;


void InsertNode(ListNodeP &ListHead, ListNodeP &ListTail, int Data)
{
	//新创建一个节点
	ListNodeP Node = (ListNodeP)malloc(sizeof(ListNode));
	Node->Data = Data;
	Node->Next = NULL;

	//链表头为空,那就把当前新创建的节点初始化给它吧
	if (ListHead == NULL)
	{
		ListHead = Node;
		ListHead->Pre = NULL;//此时前驱和后驱都为空
		ListTail = ListHead->Pre;
	}
	else
	{
		ListNodeP NodeT;
		NodeT = ListHead;//取出根节点付给当前结点
		while (NodeT->Next)//如果当前结点的后驱不为空,那我们还要继续前进
		{
			NodeT = NodeT->Next;
		}
		Node->Pre = NodeT;//把当前链表尾节点付给新创建的节点的前驱(单向链表可不要)
		NodeT->Next = Node;//把新创建的节点赋给当前链表尾节点的后驱
		ListTail = Node;//更新链表尾部(单向链表可不要)
	}
}


void TraveseList(ListNodeP ListHead, ListNodeP ListTail, int Mode)
{
	//链表正向遍历
	if (Mode == 1)
	{
		while (ListHead)
		{
			cout << "Node=" << ListHead->Data << endl;
			ListHead = ListHead->Next;
		}
	}
	//链表逆向遍历
	else if (Mode == 2)
	{
		while (ListTail)
		{
			cout << "Node=" << ListTail->Data << endl;
			ListTail = ListTail->Pre;
		}
	}

}


int main()
{
	ListNodeP ListHead = NULL;
	ListNodeP ListTail = NULL;

	int A[11] = { 24, 6, 18, 3, 7, 17, 20, 2, 4, 13, 65 };
	for (int i = 0; i < 11; i++)
	{
		InsertNode(ListHead, ListTail, A[i]);
	}
	TraveseList(ListHead, ListTail, 1);

	return 0;
}
       运行程序,将得到:24, 6, 18, 3, 7, 17, 20, 2, 4, 13, 65。如果设置 TraveseList(ListHead, ListTail, 2);将得到逆序遍历的结果。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
双向链表是一种链式存储结构,每个节点有两个指针,分别指向前驱节点和后继节点。下面是C语言实现双向链表的基本步骤: 1. 定义双向链表节点结构体,包含数据域和两个指针域。 2. 定义头节点和尾节点指针,并初始化为空。 3. 实现节点的插入操作,包括在链表头部插入、尾部插入和中间插入。 4. 实现节点的删除操作,包括删除头节点、尾节点和中间节点。 5. 实现遍历链表的操作,包括正向遍历和反向遍历。 下面是一个简单的双向链表创建的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 双向链表节点结构体 typedef struct node { int data; struct node *prev; struct node *next; } Node; // 头节点和尾节点指针 Node *head = NULL; Node *tail = NULL; // 在链表头部插入节点 void insertAtHead(int data) { Node *newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->prev = NULL; newNode->next = head; if (head != NULL) { head->prev = newNode; } else { tail = newNode; } head = newNode; } // 在链表尾部插入节点 void insertAtTail(int data) { Node *newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->prev = tail; newNode->next = NULL; if (tail != NULL) { tail->next = newNode; } else { head = newNode; } tail = newNode; } // 在链表中间插入节点 void insertAtMiddle(int data, int position) { Node *newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; Node *current = head; int i; for (i = 1; i < position && current != NULL; i++) { current = current->next; } if (current == NULL) { printf("插入位置无效\n"); return; } newNode->prev = current->prev; newNode->next = current; current->prev->next = newNode; current->prev = newNode; } // 删除头节点 void deleteAtHead() { if (head == NULL) { printf("链表为空\n"); return; } Node *temp = head; head = head->next; if (head != NULL) { head->prev = NULL; } else { tail = NULL; } free(temp); } // 删除尾节点 void deleteAtTail() { if (tail == NULL) { printf("链表为空\n"); return; } Node *temp = tail; tail = tail->prev; if (tail != NULL) { tail->next = NULL; } else { head = NULL; } free(temp); } // 删除中间节点 void deleteAtMiddle(int position) { Node *current = head; int i; for (i = 1; i < position && current != NULL; i++) { current = current->next; } if (current == NULL) { printf("删除位置无效\n"); return; } current->prev->next = current->next; current->next->prev = current->prev; free(current); } // 正向遍历链表 void traverseForward() { Node *current = head; while (current != NULL) { printf("%d ", current->data); current = current->next; } printf("\n"); } // 反向遍历链表 void traverseBackward() { Node *current = tail; while (current != NULL) { printf("%d ", current->data); current = current->prev; } printf("\n"); } int main() { insertAtHead(1); insertAtHead(2); insertAtTail(3); insertAtMiddle(4, 2); traverseForward(); deleteAtHead(); deleteAtTail(); deleteAtMiddle(2); traverseBackward(); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值