C++链表实现( 数据结构 易)

楼主编程小白一个 最近在学数据结构,分享下自己的链表学习代码,欢迎大家指教和讨论。
如有不懂,也欢迎提问,不过我真是菜鸡一个哈哈。

#include<iostream>
#include<malloc.h>
using namespace std;
typedef int ElementType;
typedef struct LNode *List;           //结构体指针

struct LNode
{
	ElementType data;
	List next;
};
List L;

List MakeEmpty();           //初始化链表
int Length(List L);        //遍历链表求链表的长度
List Findk(int k, List L);   //按序号查找
int FindX(ElementType X, List L);   //按值查找
List Insert(ElementType X, int i, List L);   //讲X插入到i-1个结点之后
bool Delete(int i, List L);  //删除第i个结点
void print(List L);    //输出链表元素

List MakeEmpty() {
	List L = new LNode;
	L = NULL;
	return L;
}

//求表长
int Length(List L) {
	List p = L;            //指向链表头结点;
	int len = 0;
	while (p) {
		p = p->next;
		len++;
	}
	return len;
}

//按序查找
List Findk(int k, List L) {
	List p = L;
	int i = 1;
	while (p && i < k) {
		p = p->next;
		i++;
	}
	if (i == k)                     //注意K可能是负数也是输入错误
		return p;
	else
		return NULL;
}

//按值查找
int FindX(ElementType X, List L) {
	List p = L;
	int count = 1;
	while (p && p->data != X){
		p = p->next;
		count++;
	}
	return count;
}

//插入
List Insert(ElementType X, int i, List L) {
	List tmp, p;
	tmp = new LNode;
	tmp->data = X;
	if (i == 1) {
		tmp->next = L;
		return tmp;        //返回新表头
	}
	else {
		//查找位序为i-1的结点看是否在内
		p = Findk(i - 1, L);
		if (p == NULL) {
			cout << "插入未知参数错误" << endl;
			delete tmp;
			return NULL;
		}
		else {
			tmp->next = p->next;
			p->next = tmp;
			return L;   //返回表头
		}
	}	
}

//删除第i个结点
bool Delete(int i, List L) {
	List tmp, p;
	if (i == 1){
		tmp= L;
		if (L != NULL)L = L->next;
		else return NULL;
		delete tmp;
		return true;
	}
	p = Findk(i - 1, L);
	if (p == NULL) {
		cout << "第" << i - 1 << "个结点不存在,删除失败" << endl;
		return false;
	}
	else if (p->next == NULL) {
		cout << "第" << i << "个结点不存在,删除失败" << endl;
		return false;
	}
	else {
		tmp = p->next;
		p->next = tmp->next;
		delete tmp;
		return true;
	}
}

//输出链表元素
void print(List L) {
	int count = 0;
	while (L) {
		cout << L->data << "->";
		L = L->next;
		count++;
	}
	cout << endl;
	if (count == 0) {
		cout << "无数据输出" << endl;
	}
}

int main()
{
	List tmp;
	L = MakeEmpty();

	L = Insert(1, 1, L);
	L = Insert(2, 2, L);
	L = Insert(3, 3, L);
	L = Insert(4, 4, L);
	L = Insert(5, 5, L);

	print(L);
	int length = Length(L);
	cout << "该链表的长度为" << length << endl;	
	
	int i; cout << "请输入你想搜寻的位置下标:  ";
	cin >> i; 
	tmp = Findk(i, L);
	cout << "第"<<i<<"个下标对应的值为" << tmp->data << endl;

	int x; cout << "请输入你想搜寻的元素的值:  ";
	cin >> x;
	int q = FindX(x,L);
	cout << "元素" << x << "在链表的位置是: " << q << endl;

	int j; cout << "请输入你想删除的元素位置: ";
	cin >> j;
	if (Delete(j, L)){
		cout << "删除后的链表为: ";
		print(L);
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
双向链表是一种常见的数据结构,与单向链表相比,它每个节点都有两个指针,分别指向前驱节点和后继节点。这样,双向链表可以实现双向遍历,插入和删除操作也更加方便。 以下是用C语言实现双向链表的代码: ```c #include <stdio.h> #include <stdlib.h> // 双向链表节点结构体 typedef struct ListNode { int val; struct ListNode *prev; struct ListNode *next; } ListNode; // 创建双向链表节点 ListNode *createNode(int val) { ListNode *node = (ListNode *)malloc(sizeof(ListNode)); node->val = val; node->prev = NULL; node->next = NULL; return node; } // 插入节点到双向链表头部 ListNode *insertAtHead(ListNode *head, int val) { ListNode *node = createNode(val); if (head == NULL) { head = node; } else { node->next = head; head->prev = node; head = node; } return head; } // 插入节点到双向链表尾部 ListNode *insertAtTail(ListNode *head, int val) { ListNode *node = createNode(val); if (head == NULL) { head = node; } else { ListNode *cur = head; while (cur->next != NULL) { cur = cur->next; } cur->next = node; node->prev = cur; } return head; } // 删除双向链表中的节点 ListNode *deleteNode(ListNode *head, int val) { if (head == NULL) { return NULL; } ListNode *cur = head; while (cur != NULL && cur->val != val) { cur = cur->next; } if (cur == NULL) { return head; } if (cur == head) { head = head->next; if (head != NULL) { head->prev = NULL; } } else { cur->prev->next = cur->next; if (cur->next != NULL) { cur->next->prev = cur->prev; } } free(cur); return head; } // 打印双向链表 void printList(ListNode *head) { while (head != NULL) { printf("%d ", head->val); head = head->next; } printf("\n"); } // 主函数 int main() { ListNode *head = NULL; head = insertAtHead(head, 1); head = insertAtHead(head, 2); head = insertAtTail(head, 3); printList(head); // 2 1 3 head = deleteNode(head, 2); printList(head); // 1 3 head = deleteNode(head, 3); printList(head); // 1 head = deleteNode(head, 1); printList(head); // return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值