C语言单链表的创建,修改,插入等

C语言单链表的创建,修改,插入等

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct LNode{
    int data;
    struct LNode* next;     
}ListNode,*LinkList; 

LinkList initList(LinkList L){ //头节点,第一个节点的数据域不存放数据 
    //头节点指针 
    L = (LinkList)malloc(sizeof(ListNode));//分配空间,L是一个指针
    if(L==NULL){
        printf("%s","location space fail");
        exit(1);
    }
    L->next = NULL;
    return L;

LinkList creatListHead(int n){//头插法建立链表
    LinkList L;
    ListNode *p;
    L = initList(L); 
    int x;
    while(n--){
        p = (ListNode *)malloc(sizeof(ListNode));
        scanf("%d",&x);
        p->data = x;
        p->next=L->next; //把L的next赋值给p
        L->next = p;//让头指针指向新插入的节点 
    }
    return L;    

LinkList createListRear(int n){//尾插法建立链表 
    
    int x = 0;
    ListNode *L,*r,*p;
    L = initList(L);//初始化头节点 
    r = L;// 把头节点赋值给尾节点,让尾指针指向头节点 
//    int arr[5] = {1,2,3,4,5};
    while(n--){
        scanf("%d",&x); //必须加&,这样才会改变x的数值,不然下面赋值的时候就是赋x没有输入的值 
        p = (ListNode *)malloc(sizeof(ListNode));// 建立一个新的节点
        p->data = x;
        p->next = NULL; //尾插法最后一个元素的指针域总是为空    
        r->next = p; //把尾指针指向新插入的节点 
        r = p;     //将新的节点作为尾指针,即将p赋值给r,在这里,
        //r只是一个尾指针,负责的只是指向谁的问题,我们将
        //p赋值给r,那么r就指向p 
    } 
    return L; //返回头节点,因为 r=L,即尾指针一开始是指向头节点的 


void outputs(LinkList L){

    LinkList p = L->next;
    for(;p!=NULL;p=p->next){
        printf("%d\n",p->data);
    } 
    printf("\n");
}
LinkList FindByValue(LinkList L,int value){ //值查找 
    LinkList p = L->next;
    int i=0;
    while(p!=NULL){
        i++;
        if(p->data==value){
            printf("%d\n", p->data);
            printf("%s\n", "序号是");
            printf("%d\n", i);
        }        
        p=p->next;
    }

LinkList FindByIndex(LinkList L,int n){//序号查找     
    LinkList p = L->next;
    if(n==0){
        printf("%d",p->data);
    }
    if(n<1){
        printf("%s","序号错误");
    }
    while(--n&&p!=NULL){
        //printf("%d\n",n);
        p = p->next;
    }
    printf("%d\n",p->data);    

LinkList insert(LinkList L,ListNode *p,int n){//插入数据 
    LinkList head = L->next;//头节点是空的,不存数据 
    
    while(--n){
        head = head->next; 
    }
    
    p->next = head->next;
    head->next = p;
    outputs(L);
    return L; 
}

ListNode *deletePoint(ListNode *L, int n){//删除结点
    ListNode *p = L->next;
    n = n-1;
    while(--(n)){//相当于(n-2)-- 
    p = p->next; 
    } 
    ListNode *q;//保存要删除的指针 
    q = p->next;
    p->next = q->next;
    outputs(L); 
    free(q);
    return L;

int length(LinkList L){
    int count = 0;
    while(L->next!=NULL){
        L = L->next;
        count++;
    }
    return count;
}
int main(){    
    //LinkList L =  createListRear(2);
    LinkList H =  createListRear(5);
    ListNode *p;
    p = (LinkList)malloc(sizeof(ListNode));
    p->data = 12;
    H = insert(H,p,2);
    H = deletePoint(H,2);
    printf("%d\n",length(H));
    //FindByIndex(H,2);
//    FindByValue(H,31);
    //printf("%d",H->next->data); 
    //outputs(H);
    return 0;

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值