#include<stdio.h>
#include<stdlib.h>
typedef int ElementType;
typedef int boolean;
#define TRUE 1;
#define FALSE 0;
typedef struct Link{
ElementType data;
struct Link * next;
}LinkList;
//创建一个节点
//参数可以指定节点的数据
LinkList * create(ElementType a){
LinkList * node = (LinkList*)malloc(sizeof(LinkList));
node->next=NULL;
node->data=a;
return node;
}
//初始化链表
//创建头节点
LinkList * init(){
LinkList * header = create(0);
return header;
}
//获取链表最后一个节点
LinkList * getLast(LinkList * list){
LinkList * f = list;
while(f->next){
f = f->next;
}
return f;
}
//获取链表任意位置的节点
//位置从0开始 0为头节点
LinkList * get(LinkList * list,int i){
LinkList * f = list;
int j=0;
if(i<0){
return NULL;
}
if(i == 0){
return list;
}
while(f->next){
f = f->next;
if(++j ==i){
return f;
}
}
return NULL;
}
//添加节点到链表尾
boolean add(LinkList * list,ElementType i){
LinkList * f = getLast(list);
f->next = create(i);
list->data+=1;
return TRUE;
}
//判断当前链表是否为空
boolean isEmpty(LinkList * list){
return list->data <= 0;
}
//移除指定位置的节点
// 参数 i 指定移除节点的位置 i为 1 移除第一个节点
boolean remove(LinkList * list,ElementType i){
LinkList * parent;
LinkList * e;
if(isEmpty(list)){
return FALSE;
}
if(i>list->data){
printf("超出链表长度\n");
return FALSE;
}
parent = get(list,i-1);
if(parent){
e= parent->next;
parent->next = e->next;
free(e);
list->data--;
return TRUE;
}
return FALSE;
}
//更新指定节点的值
boolean update(LinkList * list,int data,int i){
LinkList * ele = get(list,i);
if(ele){
ele->data = data;
return TRUE;
}
return FALSE;
}
//指定位置插入节点
boolean insert(LinkList * list,LinkList * element,int i){
LinkList * parent = get(list,i-1);
LinkList * ele;
if(!parent){
return FALSE;
}
ele = parent->next;
parent->next = element;
element->next = ele;
list->data++;
return TRUE;
}
int main(){
int i;
//初始化链表,创建头结点
LinkList * header = init();
LinkList * f = header;
//未添加节点之前查看链表是否为空
printf("当前链表是否为空:%d\n",isEmpty(header));
//添加六个节点,并且指定节点的值为当前i的值
for(i=1;i<6;i++){
add(header,i);
printf("添加元素%d\n",i);
}
//在链表尾部添加一个节点
add(header,70);
//在第一个位置上插入一个节点,该节点的数据域值为12
insert(header,create(12),1);
//更新链表第二个节点的数据域的值为77
update(header,77,2);
//添加节点后查看链表是否为空
printf("当前链表是否为空:%d\n\n\n",isEmpty(header));
//链表对头结点的数据域进行维护,用来表示当前链表的节点个数
printf("当前链表的节点个数:%d\n",header->data);
//遍历链表的每一个节点
while(f->next){
f = f->next;
printf("当前数据:%d\n",f->data);
}
return 0;
}