上节,我们初步创建了一个静态链表,本节学习有关静态链表的一些基本操作,包括对表中数据元素的添加、删除、查找和更改。
本节是建立在已能成功创建静态链表的基础上,因此我们继续使用上节中已建立好的静态链表学习本节内容,建立好的静态链表如图 1 所示:
静态链表添加元素
例如,在图 1 的基础,将元素 4 添加到静态链表中的第 3 个位置上,实现过程如下:
从备用链表中摘除一个节点,用于存储元素 4;
找到表中第 2 个节点(添加位置的前一个节点,这里是数据元素 2),将元素 2 的游标赋值给新元素 4;
将元素 4 所在数组中的下标赋值给元素 2 的游标;
经过以上几步操作,数据元素 4 就成功地添加到了静态链表中,此时新的静态链表如图 2 所示
静态链表删除元素
静态链表中删除指定元素,只需实现以下 2 步操作:
1、将存有目标元素的节点从数据链表中摘除;
2、将摘除节点添加到备用链表,以便下次再用;
提示:若问题中涉及大量删除元素的操作,建议读者在建立静态链表之初创建一个带有头节点的静态链表,方便实现删除链表中第一个数据元素的操作。
静态链表查找元素
静态链表查找指定元素,由于我们只知道静态链表第一个元素所在数组中的位置,因此只能通过逐个遍历静态链表的方式,查找存有指定数据元素的节点。
静态链表查找指定数据元素的 C 语言实现代码如下
静态链表中更改数据
更改静态链表中的数据,只需找到目标元素所在的节点,直接更改节点中的数据域即可
总结
#include<stdio.h>
#include<stdlib.h>
#define MAXSize 8
typedef struct {
int data;
int curr;
} Node;
int CreateTable(Node *);
void displayTable(Node *, int);
int MallocNode(Node *);
int initTable(Node *);
void insertTable(Node *, int body , int add, int num);
void delTable(Node * , int, int);
int SelecEum(Node * , int , int);
int ChangeNum(Node * , int , int ,int );
int main(){
Node arrayTable[MAXSize];
int body = initTable(arrayTable);
insertTable(arrayTable,body, 2, 100);
insertTable(arrayTable,body, 3, 76);
// delTable(arrayTable, 100,body);
// int res = SelecEum(arrayTable, body, 76);
ChangeNum(arrayTable,body,76,34);
displayTable(arrayTable,body);
return 0;
}
//变化内容
int ChangeNum(Node * table, int body,int oldNum, int newNum){
int changeIndex = SelecEum(table,body,oldNum);
if(changeIndex == -1){
printf("没有元素");
}
table[changeIndex].data = newNum;
return 0;
}
//查询
int SelecEum(Node * table, int body, int num){
int tempbody = body;
while(table[tempbody].curr != 0){
if(table[tempbody].data == num){
return tempbody;
}
tempbody = table[tempbody].curr;
}
return -1;
}
//删除一个节点
void delTable(Node * table, int num, int body) {
int tempbody = body;
while(table[tempbody].data != num){
tempbody = table[tempbody].curr;
}
int del = tempbody;//要删除元素位置
tempbody = body;
while(table[tempbody].curr != del){
tempbody = table[tempbody].curr;//提前一个
}
table[tempbody].curr = table[del].curr;
table[del].curr = table[0].curr;
table[0].curr = del;
}
//添加操作
void insertTable(Node * table, int body, int add, int num){
int tempbody = body;
for(int i=1;i<add;i++){
tempbody = table[tempbody].curr;
}
int insert = MallocNode(table);
table[insert].data = num;
table[insert].curr = table[tempbody].curr;
table[tempbody].curr = insert;
}
//初始化
int initTable(Node * table){
CreateTable(table);
int body = MallocNode(table);
int tempbody = body;
for(int i=1;i<5;i++){
int j = MallocNode(table);
table[tempbody].curr = j;
table[j].data = i+1;
tempbody = j;
}
table[tempbody].curr=0;//新的链表最后一个结点的指针设置为0
return body;
}
int MallocNode(Node * table){
int i;
if(table[0].curr){
i = table[0].curr;
table[0].curr = table[i].curr;
}
return i;
}
//创建
int CreateTable(Node * table){
for(int i=0;i<MAXSize;i++){
table[i].curr = i+1;
table[i].data = 0;
}
table[MAXSize-1].curr = 0;
}
void displayTable(Node * table, int body){
int tempbody = body;
while(table[tempbody].curr){
printf("%d\n",table[tempbody].data);
tempbody = table[tempbody].curr;
}
}
标签:body,int,C语言,链表,静态,tempbody,table,基本操作
From: https://www.cnblogs.com/zh718594493/p/18246926