链表C++简单实现

建立一个带值为链表长度的头节点的链表,并实现基本的增删改查。

struct ListNode
{
	int val;
	ListNode* next;
};

ListNode* newList() //新建链表
{
	ListNode *temp = (ListNode*)malloc(sizeof(ListNode));
	temp->val = 0;
	temp->next = nullptr;
	cout << "链表建立成功" << endl;
	return temp;
}

void destroyList(ListNode *head) //销毁链表
{
	ListNode *pre, *p;
	pre = head; p = pre->next;
	while (p != nullptr) {
		free(pre);
		pre = p;
		p = p->next;
	}
	free(pre);
	cout << "链表删除成功" << endl;
}

void insertElem(ListNode* head, int x)//在尾部插入元素
{
	ListNode *p = head;
	while (p->next != nullptr) {
		p = p->next;
	}	
	ListNode *temp = (ListNode*)malloc(sizeof(ListNode));
	temp->val = x;
	temp->next = nullptr;
	p->next = temp;
	head->val++;
}

void insertElem(ListNode* head, int n, int x)//在任意位置插入元素
{
	if (n > head->val + 1) {
		cout << "插入位置超出链表长度" << endl;
		return;
	}
	if (n == head->val) {
		insertElem(head, x);
		return;
	}
	ListNode *p = head;
	for (int i = 0;i < n;i++) {
		p = p->next;
	}
	ListNode *temp = (ListNode*)malloc(sizeof(ListNode));
	temp->val = x;
	temp->next = p->next;
	p->next = temp;
	head->val++;
}

void print(ListNode *head)//遍历链表
{
	ListNode *p = head->next;
	while (p != nullptr) {
		cout << p->val << " ";
		p = p->next;
	}
	cout << endl;
}

int getLength(ListNode *head) //查询链表长度
{
	return head->val;
}

int getVal(ListNode* head, int n)//按位置索引
{
	if (n > head->val) {
		cout << "查询位置超出链表长度" << endl;
		return 0;
	}
	ListNode *p = head;
	for (int i = 0;i < n;i++) {
		p = p->next;
	}
	return p->val;
}


void findVal(ListNode* head, int x) //按值查找
{
	ListNode *p = head->next;
	int num = 1;
	bool isFinded = false;
	for (int i = 1;i <= head->val;i++) {
		if (p->val == x) {
			isFinded = true;
			cout << "值" << x << "在第" << i << "个位置" << endl;
		}
		p = p->next;
	}
	if (!isFinded) {
		cout << "查找的值不存在!" << endl;
	}
}

void changeElem(ListNode* head, int n, int x)//更改元素
{
	if (n > head->val) {
		cout << "更改位置超出链表长度" << endl;
		return;
	}
	ListNode *p = head;
	for (int i = 0;i < n;i++) {
		p = p->next;
	}
	p->val = x;
}

void deleteElem(ListNode* head, int n)//删除元素
{
	if (n > head->val) {
		cout << "删除位置超出链表长度" << endl;
		return;
	}
	ListNode *p = head;
	for (int i = 0;i < n-1;i++) {
		p = p->next;
	}
	ListNode *q = p->next;
	p->next = q->next;
	free(q);
	head->val--;
}

测试:

int main()
{
	ListNode* list=newList();
	insertElem(list, 1);
	insertElem(list, 2);
	insertElem(list, 3);
	insertElem(list, 4);
	insertElem(list, 3, 3);
	cout << "链表当前长度为" << getLength(list) << endl;
	print(list);
	deleteElem(list, 2);
	changeElem(list, 1, 5);
	cout << "删除2,更改第1个元素为5后,链表为";
	print(list);
	findVal(list, 3);
	cout << "元素4在第" << getVal(list, 4) << "个位置" << endl;
	destroyList(list);
}

结果:

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇