单循环链表(C语言网)笔记

#include "stdio.h"
#include "stdlib.h"

typedef struct list{
    int data;
    struct list *next;
}list;
list * initList(){
    list *head = (list*)malloc(sizeof(list));
    if (!head) {
        printf("创建失败");
        exit(0);
    }
        
    head->next = NULL;
    return head;
}
int createList(list *head){
    
    if (head == NULL){/*会打断施法的东西写到前面*/
        printf("当前链表尚未初始化\n");
        return 0;
    }  
    int data;  
    printf("输入要插入的元素:>");
    scanf("%d",&data);
    list *node = initList();
    node->data = data;

    list *p = head;
    while(p->next != head){/*遍历定位最后一个节点*/
        p = p->next;
    }
    p->next = node;
    node->next = head;
    return 1;    
}
int deleteList(list *head){
    if (head == head->next){
        printf("链表为空");
        return 0;
    }
    list *temp,*ptr;
    temp = head;
    ptr = temp->next;

    int del;
    printf("请输入需要删除的元素:");
    scanf("%d",&del);
    while (ptr != head){
        if (ptr->data == del) {/*数据域相同*/
            temp->next = ptr->next;/*调账指针*/
            free(ptr);/*释放内存*/
            ptr = NULL;/*指针初始化*/
            return 1;
        }
        temp = temp->next;/*移动指针*/
        ptr = temp->next;/*指针跟着temp移动*/
    }
    printf("没有找到要删除的元素!\n");
    return 0;
}

int insertList(list *head, int pos, int data){
    list *temp;
    int i;
    if (head->next == head || pos < 1) return -1;
    list *node = (list *)malloc(sizeof(list));
    if (!node) return -1;
    node->data = data;
    node->next = NULL;
    
    temp = head;
    for (i=1; i<pos; ++i){
        if (temp->next == head) {
            printf("节点插入失败!\n");
            return -1;
        }
        /*实际节点数小于pos的数就返回-1*/
        /**
         * 假设一共两个节点,但i<pos=4
         * i = 1 ,满足条件进入循环,temp->next代表第一个节点
         * i = 2 ,满足条件进入循环,temp->next代表第二个节点
         * i = 3 ,满足条件进入循环,temp->next代表第三个节点(不存在),我们无法定位到第四个节点的前驱,
         * 假设pos = 3,i=3时不进入循环,我们得到第二个节点,即第三个节点的前驱,可以继续后方的操作
         * temp->next == head用来判断是否遍历完一个循环,在i=pos跳出循环之前假设已经循环完一圈说明节点不存在
         * /*/
        temp = temp->next;
    }
    
    node->next = temp->next;
    temp->next = node;
    return 1;
}
int display(list *head){
    if (head == head->next){
        printf("当前节点为空!\n");
        return 0;        
    }
    list *p = head->next;
    while (p != head){
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
}
int main(){
    list *L = initList();
    L->next = L;
    
    for (int i=1; i<5; i++)
        createList(L);
    
    deleteList(L);
    printf("在第7位前插入元素:");
    insertList(L,7,15);
    printf("在第5位前插入元素:");
    insertList(L,5,30);
    display(L);
    return 0;
}

输入: 

输入要插入的元素:>1
输入要插入的元素:>2
输入要插入的元素:>3
输入要插入的元素:>4
请输入需要删除的元素:5

输出: 

没有找到要删除的元素!
在第7位前插入元素:节点插入失败!
在第5位前插入元素:1 2 3 4 30 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值