链表实现

单链表实现

//单链表定义
typedef struct {
    int data;
    struct LNode *next;
}LNode;
//链表基本操作
    LNode* CreateLNode(int data);
    LNode* CreateList(int num);
    LNode* ListInsert(LNode* head,int index,int data);
    LNode* DeleteList(LNode* head,int index);
    bool ModifyIndex(LNode* head,int index,int data);
    bool ModifyData(LNode* head,int data,int val);
    bool OutputList(LNode* head);

    LNode* head = CreateList(10);;
    OutputList(head);
    ListInsert(head,1,65);
    OutputList(head);
    DeleteList(head,3);
    OutputList(head);
    ModifyIndex(head,4,66);
    OutputList(head);
    ModifyData(head,65,110);
    OutputList(head);
    //链表基本操作
//创建节点
LNode* CreateLNode(int data){
    LNode* node = (LNode*)malloc(sizeof(LNode));//申请内存
    node->data = data;
    node->next = NULL;
    return node;
}
//创建单链表
LNode* CreateList(int num){
    LNode* head = CreateLNode(1);
    LNode* temp = head;
    for(int i = 2;i <= num;++i){
        LNode* node = CreateLNode(i);//创建新节点
        temp->next = node;//头结点的下一个节点等于新节点
        temp = node;//temp指针指向新节点
    }
    return head;
}
//获取链表的长度
int ListLen(LNode* head){
    int len = 0;
    while (head){
        head = head->next;
        len++;
    }
    return len;
}
//在链表指定位置插入一个节点,返回头结点
LNode* ListInsert(LNode* head,int index,int data){
    if(index > ListLen(head) || index < 0){
        return head;
    }
    else if(index = 0){
        LNode* node = CreateLNode(data);
        node->next = head;
        head = node;
    } else{
        LNode* temp = head;
        for(int i = 0;i < index - 1;i++){
            temp = temp->next;
        }
        LNode* node = CreateLNode(data);
        node->next = temp->next;
        temp->next = node;
    }
    return head;
}
//删除节点
LNode* DeleteList(LNode* head,int index){
    if(index > ListLen(head) || index < 0){
        return head;
    }else if (index == 0){
        LNode* temp = head;
        head = temp->next;
        free(temp);
        temp = NULL;
    } else{
        LNode* node = head;
        for(int i = 0;i < index -1;i++){
            node = node -> next;
        }
        LNode* temp = node->next;
        node->next = temp->next;
        free(temp);
        temp = NULL;
    }
}
//查找链表中指定的数据
LNode* SelectList(LNode* head,int data){
    if(head == NULL){
        return NULL;
    }
    LNode* node = head;
    while (node){
        if(node->data ==  data){
            return node;
        }
        node = node->next;
    }
    return NULL;
}
//修改链表中指定位置节点的值
bool ModifyIndex(LNode* head,int index,int data){
    if(index > ListLen(head) || index < 0){
        return false;
    }
    LNode* node = head;
    for(int i = 0;i < index - 1;i++){
        if(node == NULL){
            return false;
        }
        node = node->next;
    }
    node->data = data;
    return true;
}
//修改链表中指定数据的值
bool ModifyData(LNode* head,int data,int val){
    LNode* node = SelectList(head,data);
    if(node){
        node->data = val;
        return true;
    }
    return false;
}
//输出链表
bool OutputList(LNode* head){
    if(head == NULL){
        return false;
    }
    LNode* node = head;
    for(int i = 0;i < ListLen(head);i++){
        printf("%d ",node->data);
        node = node->next;
    }
    printf("\n");
    return true;
}

双链表实现

//双链表定义
typedef struct {
    int data;
    struct DLNode *next;
    struct DLNode *prior;
}DLNode;
int main(){
    //双链表基本操作
    DLNode* CreateDLNnode(int data);
    DLNode* CreateDLsit(int num);
    DLNode* DListInsert(DLNode* head,int index,int data);
    DLNode* DeleteDList(DLNode* head,int index);
    bool OutputDlist(DLNode* head);

    //双链表测试
    DLNode* head = CreateDLsit(10);
    OutputDlist(head);
    DListInsert(head,3,121);
    OutputDlist(head);
    DeleteDList(head,6);
    OutputDlist(head);
	return 0;
}
//双链表基本操作
//创建节点
DLNode* CreateDLNnode(int data){
    DLNode* node = (DLNode*)malloc(sizeof(DLNode));
    node->data = data;
    node->next = NULL;
    node->prior = NULL;
    return node;
}
//创建双链表
DLNode* CreateDLsit(int num){
    DLNode* head = CreateDLNnode(1);
    DLNode* temp = head;
    for(int i = 2;i <= num;++i){
        DLNode* node = CreateDLNnode(i);
        temp->next = node;
        node->prior = temp;
        temp = node;
    }
    return head;
}
//获取链表的长度
int DListLen(DLNode* head){
    int num = 0;
    if(head == NULL)
        return 0;
    DLNode* node = head;
    while (node){
        node = node->next;
        num++;
    }
    return num;
}
//在指定位置插入节点,返回头节点
DLNode* DListInsert(DLNode* head,int index,int data){
    if(index < 0 || index > DListLen(head)){
        return head;
    }
    else if(index == 0){
        DLNode* node = CreateDLNnode(data);
        node->next = head;
        head->prior = node;
        head = node;
    } else{
        DLNode* temp = head;
        for(int i = 0;i < index - 1;i++){
            temp = temp->next;
        }
        DLNode* node = CreateDLNnode(data);
        node->next = temp->next;
        DLNode* tnode = temp->next;
        tnode->prior = node;
        temp->next = node;
        node->prior = temp;
        node = temp;
    }
    return head;
}
//删除节点
DLNode* DeleteDList(DLNode* head,int index){
     if(index < 0 || DListLen(head) < index){
         return head;
     } else if(index == 0){
         DLNode* temp = head;
         head = temp->next;
         head->prior = NULL;
         free(temp);
         temp = NULL;
     } else{
         DLNode* node = head;
         for(int i = 0;i < index - 1;i++){
             node = node->next;
         }
         DLNode* temp = node->next;
         node->next = temp->next;
         DLNode* tnode = temp->next;
         tnode->prior = node;
         free(temp);
         temp = NULL;
     }
}
//输出链表
bool OutputDlist(DLNode* head){
    if(head == NULL){
        return false;
    }
    DLNode* node = head;
    //正向输出
    printf("正向输出:\n");
    while (node){
        printf("%d ",node->data);
        node = node->next;
    }
    printf("\n");
    //反向输出
    node = head;
    for(int i = 1;i < DListLen(head);i++){
        node = node->next;
    }
    printf("反向输出:\n");
    for(int i = DListLen(head);i > 0;i--){
        printf("%d ",node->data);
        node = node->prior;
    }
    printf("\n");
    return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值