链表中一些常用的模块简单分为以下几点:追加节点、插入头节点、查找结点、插入节点、删除结点、链表长度、打印所以结点。
准备数据:
struct Data
{
char name[20];
char key[10];
int age;
};
typedef struct Node
{
Data nodeData;
struct Node*nextNode;
}CLType;
追加节点的操作步骤如下:
(1)首先分配内存空间,保存新增的结点。
(2)从头指针head开始逐个检查,直到找到最后一个节点、即表尾。
(3)将表尾的结点的地址设置为新增节点的地址。
(4)将新增节点的地址部分设置尾空地址NULL,即新增结点尾表尾。
CLType*CLAddEnd(CLType* head,Data nodeData) //追加节点
{
CLType*node, *htemp;
if(!(node=(CLType*)malloc(sizeof(CLType))))
{
printf("申请内存失败!\n"); //分配内存失败
return NULL;
}
else
{
node->nodeData=nodeData; //保存数据
node->nextNode=NULL; //设置结点指针为空,即为表尾
if(head==NULL)
{
haed=node;
retrun head;
}
htemp=head;
while(htemp->nextNode!=NULL)//查找链表的末尾
{
htemp=htemp->nextNode;
}
htemp->nextNode=mode;
return head;
}
}
插入头结点
(1)首先分配内存空间,保存新增结点。
(2)使新增结点指向头指针head所指向的结点。
(3)然后使头指针head指向新增结点。
CLType*CLAddFirst(CLType* head,Data nodeData)
{
CLType* node;
if(!(node=(CLType*)malloc(sizeof(CLType))))
{
printf("申请内存失败!\n"); //分配内存失败
return NULL;
}
else
{
node->nodeData=nodeData;//保存数据
node->nextNode=head;//指向头指针所指向的结点
head=node;//头指针指向新增的结点
return head;
}
}
在这里head为头指针,输入参数nodeData为结点保存的数据。程序首先使用malloc函数申请保存结点数据的内存空间,如果分配成功,node中将保存指向该内存区域的指针。然后,将传入的nodeData保存到申请的内存区域,并使新增结点指向头指针head所指向的结点,最后设置头指针head重新指向新增的结点。
查找节点
CLType*CLFindNode(CLType* nhead,char* key)
{
CLType* htemp;
htemp=head;//保存链表头指针
while(htemp)//若结点有效,则进行查找
{
if(strcmp(htemp->nodeData.key,key)==0)
{
return htemp;
}
htemp=htemp->nextNode;//处理下一结点
}
return NULL;
}
插入结点
(1)首先分配内存空间,保存新增结点。
(2)找到要插入结点的位置,也就是位于哪两个结点之间。
(3)修改插入位置结点的指针,使其指向新增结点,而使新增结点指向原插入位置所指向的结点。
CLType* CLInsertNode(CLType* head,char* findKey,Data nodeData)
{
CLType* nide,*nodetemp;
if(!(node=(CLType*)malloc(sizeof(CLType))))
{
printf("申请内存失败!\n"); //分配内存失败
return NULL;
}
node->nodeData=nodeData;//保存数据
nodetemp=CLFindNode(head,findkey);
if(nodetemp)
{
node->nextNode=nodetemp->nextNode;
nodetemp->nextNode=node;
}
else
{
printf("未找到正确的插入位置!\n");
free(node);//释放内存
}
return head;//返回头指针
}
删除结点
(1)查找需要删除的结点。
(2)使前一结点指向当前结点的下一结点。
(3)删除结点。
int CLDeleteNode(CLType* head,char*key)
{
CLType* node,*htemp;//node保存删除结点的前一结点
htemp=head;
node=head;
while(htemp)
{
if(strcmp(htemp->nodeData.key,key)==0)
{
node->nextNode=htemp->nextNode;//使前一结点指向当前结点的下一结点
free(htemp);//释放内存
return 1;
}
else
{
node=htemp;//指向当前结点
htemp=htemp->nextNode;//指向下一结点
}
}
return 0;//未删除
}
计算链表长度
int CLLength(CLType* head)
{
CLType* htemp;
int len=0;
htemp=head;
while(htemp)
{
len++;
htemp=htemp->nextNode;
}
return len;
}
显示所有结点
void CLAllNode(CLType* head)
{
CLType* htemp;
Data nodeData;
htemp=head;
printf("当前链表共有%d个结点。链表数据如下:\n",CLLength(head));
while(htemp)
{
nodeData=htemp->nodeData;//获取结点数据
printf("结点(%s,%s,%d)\n",nodeData.key,nodeData.name,nodeData.age);
htemp=htemp->nextNode;//处理下一结点
}
}
练练手
#include<iostream>
#include<algorithm>
using namespace std;
struct Node {
int data;
Node* next;
};
Node* creat() {
Node* head, *p;
head = new Node;
p = head;
int x,cycle = 1;
while (cycle) {
cin >> x;
if (x) {
Node* node = new Node;
node->data = x;
p->next = node;
p = node;
}
else {
cycle = 0;
}
}
head = head->next;
p->next = NULL;
return head;
}
Node* InsertTailNode(Node* head, int data) {
Node* node = new Node, *temp;
node->data = data;
node->next = NULL;
if (head == NULL) {
head = node;
return node;
}
temp = head;
while (temp->next) {
temp = temp->next;
}
temp->next = node;
return head;
}
Node* InsertHeadNode(Node* head, int data) {
Node* node=new Node,*p;//动态申请插入节点内存,建立临时链表指针指向头节点。
p = head;
node->data = data;
node->next = p;
head = node;
return head;
}
Node* FindNode(Node* head, int data) {
if (head == NULL)return NULL;
Node* node = head->next;
while (node) {
if (node->data == data) {
return node;
}
node = node->next;
}
return NULL;
}
Node* InsertNode(Node* head, Node* node, int data) {
Node* temp1, temp2;
node->data = data;
temp1 = FindNode(node, data);
if (temp1) {
node->next = temp1->next;
temp1->next = node;
}
else {
cout << "没有该节点";
free(temp1);
}
return head;
}
int NodeLength(Node* head) {
Node* temp = head;
int count = 0;
while (temp) {
count++;
temp = temp->next;
}
return count;
}
void PrintfNode(Node* head) {
Node* temp = head;
while (temp) {
cout << temp->data << " ";
temp = temp->next;
}
}
int main() {
Node* head = creat();
head=InsertHeadNode(head, 9);
head = InsertTailNode(head, 111);
PrintfNode(head);
cout << "链表长度" << endl;
cout << NodeLength(head) << endl;
return 0;
}