#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");
}
[练习]自己写的C语言链表模板 ver 1.0
最新推荐文章于 2022-12-06 22:34:28 发布