数据结构——链表基本操作

//链表

#include<iostream>
using namespace std;

#define DataType int 

//结点结构体定义
struct ListNode {
	DataType data;
	ListNode *next;
};
/*
1.数据域:要存储的数据
2.指针域:指向后一结点的地址
*/




//结点创建
ListNode* ListCreateNode(DataType data) {
	ListNode* node = (ListNode*)malloc(sizeof(ListNode));
	node->data = data;
	node->next = NULL;
	return node;
}




//链表创建——头插法
ListNode* ListCreateListByHead(int n,int* a){
	ListNode *head = NULL, *vtx;
	while (n--) {
		vtx = ListCreateNode(a[n]);
		//第一步:创建一个新的结点


		vtx->next = head;  
		//第二步:对结点内容进行设置(此时只有指针域未设置)
		//设置其指针指向后继结点(这也是对头部进行设置)


		head = vtx;
		//第三步:将头结点指针指向vtx(目前来讲新的头结点)


	}
	return head;
	//返回到链表头结点的位置
	

}





//链表打印
void ListPrint(ListNode* head) {
	ListNode* vtx = head;
	while (vtx != NULL) {
		cout << vtx->data << "->";
		vtx = vtx->next;
	}
	cout << "NULL" << endl;
}


//链表结点索引
ListNode* ListGetNode(ListNode* head, int i) {
	ListNode* vtx = head;
	for (int j = 0;j < i; j++) {
		if (vtx == NULL)return NULL;
		vtx = vtx->next;
	}
	return vtx;
}





//链表元素查找
ListNode* ListFindNodeByValue(ListNode* head, DataType n) {
	ListNode* vtx = head;
	while (vtx != NULL) {
		if (vtx->data == n)return vtx;
		vtx = vtx->next;
	}
	return NULL;
}


//链表结点插入
ListNode* ListInsertNode(ListNode* head, int i,DataType x) {
	ListNode* pre = head, * vtx,  * aft;
	for (int j = 0; j < i; j++) {
		if (pre == NULL)return NULL;
		pre = pre->next;
	}
	if (pre == NULL)return NULL;
	vtx = ListCreateNode(x);
	aft = pre->next;
	vtx->next = aft;
	pre->next = vtx;
	return vtx;
}


//结点删除操作
ListNode* ListDeleteNode(ListNode* head, int i) {
	ListNode* pre, * del, * aft;
	if (head == NULL) {
		return NULL;
	}
	if (i == 0) {
		del = head;
		head = head->next;
		free(del);
		return head;
	}
	pre = head;
	for (int j = 0; j < i - 1; j++) {
		if (pre != NULL)pre = pre->next;
	}
	if (pre == NULL || pre->next == NULL) {
		return head;
	}
	del = pre->next;
	aft = del->next;
	pre->next = aft;
	free(del);
	return head;
}











int main() {
	int a[5] = { 1,3,8,2,6 };
	ListNode* head = ListCreateListByHead(5, a);

	ListNode* get1 = ListGetNode(head, 0);
	cout << get1->data << "\t" << get1->next << endl;


	ListNode* get2 = ListFindNodeByValue(head, 3);
	cout << get2->data << "\t" << get2->next << endl;


	ListNode* get3 = ListInsertNode(head, 4, 5);
	cout << get3->data << "\t" << get3->next << endl;


	ListNode* get4 = ListDeleteNode(head, 1);
	ListPrint(head);


	return 0;
}
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值