盗墓者是个丑奴儿,原
注意: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语言功底,博主越来越巩固了。