mnbmb

#include"doublelinklist.h"
 
int main(int argc,const char *argv[])
{
    int n=0;
    datatype e;
    int flag=0;
    int pos=0;
 
    //创建头结点
    Doublelinklist L=creat_head();
#if 0
    printf("头插\n");
    //头插
    printf("请输入要插入元素的个数:");
    scanf("%d",&n);
    for(int i=0;i
        printf("请输入要插入的字符元素:");
        scanf(" %c",&e);
        insert_head(L,e);
    }
 
    //双向遍历双链表
    Output(L);
#else
    //尾插
    printf("尾插:\n");
    printf("请输入要插入元素的个数:");
    scanf("%d",&n);
    for(int i=0;i
        printf("请输入要插入的字符元素:");
        scanf(" %c",&e);
        insert_rear(L,e);
    }
    Output(L);
#endif
/*
    //头删
    printf("头删结果:\n");
    flag=delete_head(L);
    if(flag==-1)
        printf("头删失败\n");
    else
        Output(L);
    
    //尾删
    printf("尾删结果:\n");
    flag=delete_rear(L);
    if(flag==-1)
        printf("尾删失败\n");
    else
        Output(L);
 
    //按位置插入
    printf("请输入要插入的位置:");
    scanf("%d",&pos);
    printf("请输入要插入的字符元素:");
    scanf(" %c",&e);
    flag=insert_by_pos(L,pos,e);
    printf("按位置插入结果:\n");
    if(flag==-1)
        printf("按位置插入失败\n");
    else
        Output(L);
 
 
    //按位置删除
    printf("请输入要删除的位置:");
    scanf("%d",&pos);
    flag=delete_by_pos(L,pos);
    printf("按位置删除的结果\n");
    if(flag==-1)
        printf("按位置删除失败\n");
    else
        Output(L);
*/
 
    //按位置修改
    printf("请输入要修改的位置:");
    scanf("%d",&pos);
    printf("请输入要修改的字符元素:");
    scanf(" %c",&e);
    flag=updata_by_pos(L,pos,e);
    printf("按位置修改结果:\n");
    if(flag==-1)
        printf("按位置修改失败\n");
    else
        Output(L);
 
    //按位置查找
    printf("请输入要查找的位置:");
    scanf("%d",&pos);
    printf("按位置查找结果:\n");
    search_by_pos(L,pos);
 
    //释放空间
    L=free_Doublelinklist(L);
    
    return 0;
}
doublelinklist.c
 
#include"doublelinklist.h"
 
/*
 *function :  创建头结点
 *@param [in]:  无参数
 *@param [out]:
 *@return :  成功返回头结点的首地址,失败返回NULL
 */
Doublelinklist creat_head(){
    Doublelinklist L=(Doublelinklist)malloc(sizeof(struct Node));
    if(L==NULL)
        return NULL;
    return L;
}
 
/*
 *function :  创建结点
 *@param [in]:  无参数
 *@param [out]:
 *@return :  成功返回结点首地址,失败返回NULL
 */
Doublelinklist creat_code(){
    Doublelinklist p=(Doublelinklist)malloc(sizeof(struct Node));
    if(p==NULL)
        return NULL;
    return p;
}
 
/*
 *function :  头插
 *@param [in]:  双链表,插入的元素
 *@param [out]:
 *@return :  成功返回0;失败返回-1
 */
int insert_head(Doublelinklist L,datatype e){
    //判断头结点是否存在
    if(L==NULL)
        return -1;
    //创建新结点p
    Doublelinklist p=creat_code();
    if(p==NULL)
        return -1;
    //p的数据域赋值
    p->data=e;
    //在头结点后插入p
    p->next=L->next;
    p->prev=L;
    if(L->next!=NULL)//判断头结点后面是否有结点
        L->next->prev=p;
    L->next=p;
    L->len++;
    return 0;
}
 
/*
 *function :  双向遍历双链表
 *@param [in]:  双链表
 *@param [out]:
 *@return :  
 */
void Output(Doublelinklist L){
    //判断头结点是否存在,链表长度是否为0
    if(L==NULL||L->len==0)
        return;
    
    Doublelinklist p=L;
#if 0
    for(int i=0;ilen;i++){
        p=p->next;
        printf("%c\t",p->data);
    }
    printf("\n");
    for(int i=0;ilen;i++){
        p=p->prev;
        printf("%c\t",p->data);
    }
    printf("\n");
#else
    printf("正向:\n");
    while(p->next){
        p=p->next;
        printf("%c\t",p->data);
    }
    printf("\n");
    printf("逆向:\n");
    while(p->prev){
        printf("%c\t",p->data);
        p=p->prev;
    }
    printf("\n");
#endif
}
 
/*
 *function : 尾插 
 *@param [in]:  双链表,要插入的元素
 *@param [out]:
 *@return :  成功返回0,失败返回-1
 */
int insert_rear(Doublelinklist L,datatype e){
    if(L==NULL)
        return -1;
    Doublelinklist p=L;
    //让p到达最后一个结点
    while(p->next){
        p=p->next;
    }
    //创建新结点
    Doublelinklist s=creat_code();
    //s的数据域赋值
    s->data=e;
    //s的指针域
    s->prev=p;
    s->next=p->next;
    p->next=s;
    L->len++;
    return 0;
}
 
/*
 *function :  头删
 *@param [in]:  双链表
 *@param [out]:
 *@return :  成功返回0,失败返回-1
 */
int delete_head(Doublelinklist L){
    if(L==NULL||L->len==0)
        return -1;
    Doublelinklist p=L->next;
    L->next=p->next;
    if(p->next!=NULL)
        p->next->prev=L;
    free(p);
    p=NULL;
    L->len--;
    return 0;
}
 
/*
 *function :  尾删
 *@param [in]:  双链表
 *@param [out]:
 *@return :  成功返回0,失败返回-1
 */
int delete_rear(Doublelinklist L){
    if(L==NULL || L->len==0)
        return -1;
    Doublelinklist p=L;
    while(p->next){
        p=p->next;
    }
    p->prev->next=NULL;
    free(p);
    p=NULL;
    L->len--;
    return 0;
}
 
/*
 *function :  按位置插入
 *@param [in]:  双链表,位置,插入的值
 *@param [out]:
 *@return :  成功返回0,失败返回-1
 */
int insert_by_pos(Doublelinklist L,int pos,datatype e){
    //判断头结点是否存在,位置是否合法
    if(L==NULL||pos<1||pos>(L->len)+1)
        return -1;
    //找到pos-1
    Doublelinklist p=L;
    for(int i=0;i
        p=p->next;
    }
    //创建新结点
    Doublelinklist s=creat_code();
    //数据域赋值
    s->data=e;
    //指针域
    s->next=p->next;
    s->prev=p;
    if(p->next!=NULL)
        p->next->prev=s;
    p->next=s;
    L->len++;
    return 0;
}
 
/*
 *function :  按位置删除
 *@param [in]:  双链表,位置
 *@param [out]:
 *@return :  成功返回0,失败返回-1
 */
int delete_by_pos(Doublelinklist L,int pos){
    //判断头结点是否存在,链表长度是否为0,位置是否合法
    if(L==NULL||L->len==0||pos<1||pos>L->len)
        return -1;
    //找到pos
    Doublelinklist p=L;
    for(int i=0;i
        p=p->next;
    }
    p->prev->next=p->next;
    if(p->next!=NULL)
        p->next->prev=p->prev;
    L->len--;
    return 0;
}
 
/*
 *function :  按位置修改
 *@param [in]:  双链表,位置,修改的值
 *@param [out]:
 *@return :  成功返回0,失败返回-1
 */
int updata_by_pos(Doublelinklist L,int pos,datatype e){
    if(L==NULL||L->len==0||pos<1||pos>L->len)
        return -1;
    Doublelinklist p=L;
    for(int i=0;i
        p=p->next;
    }
    p->data=e;
    return 0;
}
 
/*
 *function :  按位置查找
 *@param [in]:  双链表,位置
 *@param [out]:
 *@return :  成功返回0,失败返回-1
 */
int search_by_pos(Doublelinklist L,int pos){
    if(L==NULL||L->len==0||pos<1||pos>L->len)
        return -1;
    Doublelinklist p=L;
    for(int i=0;i
        p=p->next;
    }
    printf("该位置的值为:%c\n",p->data);
    return 0;
}
 
/*
 *function :  释放空间
 *@param [in]:  双向链表
 *@param [out]:
 *@return :  返回NULL
 */
Doublelinklist free_Doublelinklist(Doublelinklist L){
    if(L==NULL)
        return NULL;
    Doublelinklist p=L->next;
    while(p->next){
        delete_rear(L);
    }
    free(L);
    L=NULL;
    return L;
}

单向循环链表操作:
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
 
#include
#include
#include
 
typedef float datatype;
 
typedef struct Node{
    //数据域
    union{
        int len;
        datatype data;
    };
    //指针域
    struct Node *next;
}*LoopLink;
 
LoopLink creat_head();
LoopLink creat_node();
int insert_head(LoopLink L,datatype e);
void Output(LoopLink L);
int insert_rear(LoopLink L,datatype e);
int delete_head(LoopLink L);
int delete_rear(LoopLink L);
 
#endif

main.c
#include"head.h"
int main(int argc,const char *argv[])
{
    int n;
    datatype e;
    int flag=0;
 
    //创建头结点
    LoopLink L=creat_head();
#if 0
    //头插
    printf("头插:\n");
    printf("请输入要输入元素的个数:");
    scanf("%d",&n);
    for(int i=0;i
        printf("请输入元素(小数):");
        scanf("%f",&e);
        insert_head(L,e);
    }
 
    //遍历
    Output(L);
#else
 
    //尾插
    printf("尾插:\n");
    printf("请输入要输入元素的个数:");
    scanf("%d",&n);
    for(int i=0;i
        printf("请输入元素(小数):");
        scanf("%f",&e);
        insert_rear(L,e);
    }
    Output(L);
    
 
#endif
    //头删
    printf("头删:\n");
    flag=delete_head(L);
    if(flag==-1)
        printf("头删失败\n");
    else
        Output(L);
 
    //尾删
    printf("尾删:\n");
    flag=delete_rear(L);
    if(flag==-1)
        printf("尾删失败\n");
    else
        Output(L);
    return 0;
}

#include"head.h"
 
/*
 *function :  创建头结点
 *@param [in]:  无参数
 *@param [out]:
 *@return :  成功返回头结点首地址,失败返回NULL
 */
LoopLink creat_head(){
    LoopLink L=(LoopLink)malloc(sizeof(struct Node));
    if(L==NULL)
        return NULL;
    L->len=0;
    L->next=L;
    return L;
}
 
/*
 *function :  创建新结点
 *@param [in]:  无参数
 *@param [out]:
 *@return :  成功返回结点首地址,失败返回NULL
 */
LoopLink creat_node(){
    LoopLink p=(LoopLink)malloc(sizeof(struct Node));
    if(p==NULL)
        return NULL;
    p->data=0;
    p->next=NULL;
    return p;
}
 
/*
 *function :  头插
 *@param [in]:  循环单链表,插入的值
 *@param [out]:
 *@return :  成功返回0,失败返回-1
 */
int insert_head(LoopLink L,datatype e){
    //判断头结点是否存在
    if(L==NULL)
        return -1;
    //创建新结点
    LoopLink p=creat_node();
    //判断新结点是否创建成功
    if(p==NULL)
        return -1;
    //p的数据域赋值
    p->data=e;
    //p的指针域
    p->next=L->next;
    L->next=p;
    L->len++;
    return 0;
}
 
/*
 *function :  遍历循环单链表
 *@param [in]:  循环单链表
 *@param [out]:
 *@return :  无返回值
 */
void Output(LoopLink L){
    //判断头结点是否存在,链表长度是否为0
    if(L==NULL||L->len==0)
        return ;
    LoopLink p=L;
    for(int i=0;ilen;i++){
        p=p->next;
        printf("%.2f\t",p->data);
    }
    printf("\n");
}
 
/*
 *function :  尾插
 *@param [in]:  循环单链表,要插入的元素
 *@param [out]:
 *@return :  成功返回0,失败返回-1
 */
int insert_rear(LoopLink L,datatype e){
    //判断头结点是否存在
    if(L==NULL)
        return -1;
    //找到最后一个结点
    LoopLink p=L;
    while(p->next!=L){
        p=p->next;
    }
    //创建新结点
    LoopLink s=creat_node();
    if(s==NULL)
        return -1;
    //s的数据域赋值
    s->data=e;
    //指针域
    s->next=p->next;
    p->next=s;
    L->len++;
    return 0;
}
 
/*
 *function :  头删
 *@param [in]:  循环单链表
 *@param [out]:
 *@return :  成功返回0,失败返回-1
 */
int delete_head(LoopLink L){
    //判断头结点是否存在,链表长度是否为0
    if(L==NULL||L->len==0)
        return -1;
    LoopLink p=L->next;
    L->next=p->next;
    free(p);
    p=NULL;
    L->len--;
}
 
/*
 *function :  尾删
 *@param [in]:  循环单链表
 *@param [out]:
 *@return :  成功返回0,失败返回-1
 */
int delete_rear(LoopLink L){
    //判断头结点是否存在,链表长度是否为0
    if(L==NULL||L->len==0)
        return -1;
    //找到最后一个结点的前一个结点
    LoopLink p=L;
    for(int i=0;ilen-1;i++){
        p=p->next;
    }
    LoopLink s=p->next;
    p->next=s->next;
    free(s);
    s=NULL;
    L->len--;


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部