[练习]自己写的C语言链表模板 ver 1.0

#include <stdio.h>
#include <stdlib.h>
//定义布尔数值 true false 
#define true 1
#define false 0
//定义错误类型 wrong 
#define wrong 0x7fffffff
typedef int boolean;//定义布尔类型 
typedef struct Node *list,*position;
struct Node{
    int data;//数据域,可根据实际情况修改 
    position next,prev;//指针域
};
boolean isempty(list List){//判断链表为空 
    return List->next==List->prev;
}
position create_list(){//建表 
    position List=(list)malloc(sizeof(Node)),tem=(list)malloc(sizeof(Node));
    if(List!=NULL&&tem!=NULL){//如果申请失败
        //list的头节点的数据域为链表长度,初始化为0 
        List->data=0;
        //list的尾节点的数据域不可访问
        tem->data=wrong;
        //让list的头指向尾,尾指向头 
        List->next=tem;
        List->prev=tem;
        tem->next=List;
        tem->prev=List;
    }
    if(tem==NULL)return NULL;//如果申请失败
    else return List;//否则返回申请成功的头节点 
}
position find(list List,int val){//寻找数值为val的节点 
    if(isempty(List))return NULL;
    else{
        position posptr=List;
        while(posptr->next!=List->prev){
            posptr=posptr->next;
            if(posptr->data==val)return posptr;
        }
    }
    return NULL;
}
position search(list List,int pos){//寻找第pos个节点 
    if(isempty(List))return NULL;
    else{
        position posptr=List;
        while(pos&&posptr->next!=List->prev){
            posptr=posptr->next;
            pos--;
        }
        //printf("%d,%d\n",pos,posptr==NULL);
        if(pos==0)return posptr;
        else return NULL;
    }
}
boolean ins(list List,int val,int pos){//在第pos个位置插入数据域的数值为val的节点 
    position tem=(list)malloc(sizeof(Node));
    if(tem==NULL)return false;//如果申请失败 
    else{
        position posptr;
        if((posptr=search(List,pos))!=NULL){//如果找到
            //插入 
            tem->next=posptr;
            tem->prev=posptr->prev;
            posptr->prev->next=tem;
            posptr->prev=tem;
            tem->data=val;
            List->data++;
            return true;
        }
    }
    return false;
}
boolean update(list List,int val,int pos){//更新第pos个节点数据域数值为val 
    position posptr;
    if((posptr=search(List,pos))!=NULL){
        posptr->data=val;
        return true;
    }
    return false;
}
boolean del(list List,int pos){//删除第pos个节点 
    position posptr;
    //printf("%d",(posptr=search(List,pos))==NULL);
    if((posptr=search(List,pos))!=NULL){
        //printf("here1\n");
        posptr->prev->next=posptr->next;
        posptr->next->prev=posptr->prev;
        free(posptr);
        //printf("here2\n");
        List->data--;
        return true;
    }
    return false;
}
void push_back(list List,int val){//加入元素到链表尾部 
    position tem=(list)malloc(sizeof(Node));
    if(tem==NULL)return ;
    else{
        tem->next=List->prev;
        tem->prev=List->prev->prev;
        List->prev->prev->next=tem;
        List->prev->prev=tem;
        tem->data=val;
        List->data++;
    }
    return ;
}
void push_front(list List,int val){//加入元素到链表头部 
    position tem=(list)malloc(sizeof(Node));
    if(tem==NULL)return ;
    else{
        tem->next=List->next;
        tem->prev=List;
        List->next->prev=tem;
        List->next=tem;
        tem->data=val;
        List->data++;
    }
    return ;
}
int front(list List){//输出顶端元素 
    return List->next->data;
}
int back(list List){//输出末端元素 
    if(isempty(List))return wrong;
    return List->prev->prev->data;
} 
/*void sort(list List){}*/
int listlen(list List){//返回链表长度 
    return List->data;
}
void lclear(list List){//清除链表 
    while(!isempty(List))del(List,1);
    //printf("%d\n",listlen(List));
    free(List->prev);
    free(List);
}
void travelse(list List){//遍历 
    if(isempty(List)){
        printf("Empty!!\n");
    }else{
        position posptr=List;
        while((posptr=posptr->next)!=List->prev)printf("%d ",posptr->data);
        printf("\n");
    }
}
int main(){//测试
    list l=create_list();
    if(l!=NULL){
        printf("遍历:");travelse(l);
        printf("现在第一个元素是:%d\n",front(l));
        printf("现在最后一个元素是:%d\n",back(l));
        printf("插入100到第一个\n");
        push_front(l,100);
        printf("遍历:");travelse(l);
        printf("插入20到第一个\n");
        push_front(l,20);
        printf("遍历:");
        travelse(l);
        printf("插入50到最后一个\n");
        push_back(l,50);
        printf("遍历:");
        travelse(l);
        printf("现在第一个元素是:%d\n",front(l));
        printf("现在最后一个元素是:%d\n",back(l)); 
        printf("插入10到第一个\n");
        push_front(l,10);
        printf("现在链表长度为%d\n",listlen(l));
        printf("遍历:");
        travelse(l);
        printf("插入999到第三个\n");
        ins(l,999,3);
        printf("现在链表长度为%d\n",listlen(l));
        printf("遍历:");
        travelse(l);
        printf("删除第三个\n");
        del(l,3);
        printf("遍历:");
        travelse(l);
        lclear(l);
    }else printf("-1");
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值