链表的增删改查,这儿加了链表节点的排序问题,希望对初学者有帮助。
代码如下:
#include "pch.h"
#include <iostream>
#include<stdlib.h>
//链表的增删改查
typedef int DATA;
struct LinkList
{
DATA data;
LinkList* next;
};
LinkList* pHead = NULL;
//建立链表,添加节点
void Append(DATA data)
{
LinkList* p1 = pHead;
LinkList* news = (LinkList*)malloc(sizeof(LinkList));
if (news != NULL)
{
news->data =data;
news->next = pHead;
pHead = news;
}
else
{
printf("没有申请成功!");
}
}
//记录链表长度,如果没有特殊要求可以不必记录链表长度
int listLen()
{
int nlength = 0;
LinkList* p = pHead;
while (p)
{
nlength++;
p = p->next;
}
return nlength;
}
//在链表中插入节点
int InsertNode(DATA data, DATA data1)//InsertNode(插入的位置,要插入的数据)
{
LinkList* p = pHead;
while (p)
{
if (p->data == data)
{
LinkList* newsNode = (LinkList*)malloc(sizeof(LinkList));
newsNode->data = data1;
newsNode->next = p->next;
p->next = newsNode;
return 1;
}
p = p->next;
}
return 0;
}
//删除节点
int deleteNode(int data)
{
LinkList* p = pHead;
LinkList* p1 = NULL;
if (pHead->data== data)
{
pHead = pHead->next;
free(p);
return 1;
}
while (p)
{
if (p->data == data)
{
p1->next = p->next;
free(p);
return 1;
}
p1 = p;//保留节点
p = p->next;//下一个节点
}
return 0;
}
//修改节点里的值
int modify(DATA data, DATA ndata)//modify(源数据,要赋值的数据)
{
LinkList* p = pHead;
while(p)
{
if (p->data==data)
{
p->data = ndata;
return 1;
}
p = p->next;
}
return 0;
}
//查询节点,指定数据查找
int contentNode(DATA data)
{
LinkList* p = pHead;
while (p)
{
if (p->data==data)
{
printf("位置在:%p 值为:%d", p, p->data);
return 1;
}
p = p->next;
}
return 0;
}
//对链表节点里的值,在这儿就是数字,进行从小到大排序。可能不太好理解,可以用印象笔记圈点画图分析,只要理解p1和p2的指针指向的变化,就能理解这个排序
void orderBy()
{
LinkList* p = pHead;
while (p)
{
LinkList* p1 = p->next;
LinkList* p2 = p;
while (p1)
{
if (p2->data > p1->data)
{
p2 = p1;
}
p1 = p1->next;
}
if (p2!=p)
{
DATA temp = p->data;
p->data = p2->data;
p2->data = temp;
}
p = p->next;
}
}
//打印链表信息
void Print()
{
LinkList* p = pHead;
while (p)
{
printf("\n链表的值:%d 地址:%p 下一个地址:%p\n", p->data, p,p->next);
p=p->next;
}
}
int main()
{
Append(5);
Append(4);
Append(3);
Append(2);
Append(1);
Append(33);
Append(49);
//修改前
Print();
//修改后
//modify(33,500);
//Print();
//printf("链表的长度 %d\n",listLen());
InsertNode(33, 1000);//插入一个节点
//deleteNode(33);//删除一个节点
//contentNode(33);//查询数据
Print();
system("pause");
}