建立一个带值为链表长度的头节点的链表,并实现基本的增删改查。
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);
}
结果: