C语言数据结构实现-静态链表2-基本操作

上节,我们初步创建了一个静态链表,本节学习有关静态链表的一些基本操作,包括对表中数据元素的添加、删除、查找和更改。

本节是建立在已能成功创建静态链表的基础上,因此我们继续使用上节中已建立好的静态链表学习本节内容,建立好的静态链表如图 1 所示:
image

静态链表添加元素

例如,在图 1 的基础,将元素 4 添加到静态链表中的第 3 个位置上,实现过程如下:
从备用链表中摘除一个节点,用于存储元素 4;
找到表中第 2 个节点(添加位置的前一个节点,这里是数据元素 2),将元素 2 的游标赋值给新元素 4;
将元素 4 所在数组中的下标赋值给元素 2 的游标;

经过以上几步操作,数据元素 4 就成功地添加到了静态链表中,此时新的静态链表如图 2 所示
image

静态链表删除元素

静态链表中删除指定元素,只需实现以下 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;
    }
 }

posted on 2024-06-13 22:54  孤灯引路人  阅读(4)  评论(0编辑  收藏  举报

导航