c语言,链表集合、盗墓者是个丑奴儿

盗墓者是个丑奴儿,原

注意:c无对象数据类型Object,本文使用int做链表的数据存储类型(缺点:单一),面向对象的链表制作方法一致。链表制作方法:除头尾以外,结构体上下分别引用别的结构体。靠引用地址做无限存储。依旧使用malloc,否则栈被冲掉

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>

//重定义int类型,方便替换链表的数据类型

typedef int I;

//使用结构体来做双链表,分3段:

//指向上一个链的指针,数据,指向下一个链的指针
struct link{
        struct link * pre;
        I data;
        struct link * next;
};

//链表的头

struct link * top=NULL;

//链表的尾
struct link * fool=NULL;

//链表的大小
int size=0;                     //Linklist_Size

//参数int,作用:给链表中添加链

int add(int val){
        if(top==NULL){
                struct link * node=(struct link *)malloc(sizeof(struct link));
                node->data=val;
                top=node;
                fool=node;
                size++;
                return 1;
        }else{
                struct link * node=(struct link *)malloc(sizeof(struct link));
                node->data=val;
                node->pre=fool;
                fool->next=node;
                fool=node;
                size++;
                return 1;
        }
        return 0;
}
 

//参数int,作用:删除链表中这个下标的结构体

int del(int num){
        if(num>=size)
        return 0;
        struct link * var=NULL;
        if(num==0){
                var=top;
                (top->next)->pre=NULL;
                top=top->next;
        }else if(num==size-1){
                var=fool;
                (fool->pre)->next=NULL;
                fool=fool->pre;
        }else{
                var=top;
                for(int i=0;i<size;i++){
                        if(num==i){
                                (var->pre->next)=var->next;
                                (var->next->pre)=var->pre;
                        }
                        var=var->next;
                }
        }
        int data=var->data;
        free(var);
        size--;
        return data;
}

//参数int,返回:链表中这个下标的结构体

struct link * getNode(int num){
        struct link * var=top;
        for(int i=0;i<size;i++){
                if(num==i){
                        return var;
                }
                var=var->next;
        }
        return NULL;
}

//参数int,返回:链表中这个下标的结构体中的data数据值

int sel(int num){
        if(num>=size)
        return 0;
        struct link * var=top;
        if(num==0){
                return var->data;
        }
        var=getNode(num);
        return var==NULL?0:var->data;
}

//参数int,作用:覆盖链表中这个下标的结构体的data数据值

int upd(int num,int val){
        struct link * var=getNode(num);
        if(var==NULL){
                return 0;
        }else{
                var->data=val;
                return 1;
        }
}

int ins(int num,int val){
        struct link * var=getNode(num);
        if(var==NULL)
        return 0;
        struct link * node=(struct link *)malloc(sizeof(struct link));
        node->data=val;
        if(num==0){
                node->next=top;
                top->pre=node;
                top=node;
        }else if(num==size-1){
                node->pre=fool;
                fool->next=node;
                fool=node;
        }else{
                node->pre=var;
                node->next=var->next;
                var->next->pre=node;
                var->next=node;
        }
        size++;
        return 1;
}

//返回链表的大小

int getSize(){
        return size;
}

//测试
int main(void){

        int a=add(1);
        int b=add(2);
        int c=add(3);
        int d=add(4);
        int e=add(5);
        int f=add(6);

        printf("state: %d %d %d %d %d size: %d \n",a,b,c,d,e,size);

        int g=del(0);
        printf("delete: %d\n",g);

        printf("size: %d\n",getSize());

        int h=sel(0);
        printf("select: %d\n",h);

        upd(0,1);

        ins(2,9);
        ins(0,0);
        ins(size-1,8);

        printf("NodeValue : ");
        struct link * var=top;
        for(int i=0;i<size;i++){
                printf("%d ",var->data);
                var=var->next;
        }
        printf("\n");

      }

运行结果:

添加1,2,3,4,5,6,打印返回状态,打印当前链表大小。1成功0失败。delete删除第一个链,getSize()再次获得当前链大小,为5。sel查询第一个链的存储数据,链1data1被删除,当前链头为2。查询到2打印正常。upd修改第0个为1,ins插入3次,测试正常。

其他下标也有测试,OK。一着不慎,陷入排错,需要考验动手动脑与基本功能力。至之前的c语言功底,博主越来越巩固了。

猜你喜欢

转载自blog.csdn.net/java_dmz/article/details/81067283