//链表
#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;
}
数据结构——链表基本操作
最新推荐文章于 2022-05-29 14:54:28 发布