数据结构-单链表

  1. 引入:线性表适用于频繁的查找数据,很少进行插入和删除操作。入需要频繁的插入和删除,宜采用链表。
  2. 链式结构:使用结构体来存储数据和前/后继相关联的地址(下一个结构体的指针)。
  3.  #include<stdio.h>  
        #include<malloc.h>  
        #include<stdbool.h>  
        /** 
        **链表节点的定义 
        */  
        typedef struct  Node{  
        int data;//数据域  
        struct Node * PNext;//指针域,存放下一个节点的地址  
        } Node ,* PNode ;  
        /** 
        **创建链表 
        */  
        PNode create_list()  
        {  
            int len,i;  
            printf("请输入链表的长度:len=\n");  
            scanf("%d",&len);  
            PNode PHead=malloc(sizeof(Node));  
            PHead->PNext=NULL;  
            PNode PTail=PHead;//PTail是永远指向尾节点的指针  
            for(i=0;i<len;i++)  
            {  
                int val;  
                printf("请输入第 %d 个元素的值:", i+1);  
                scanf("%d",&val);  
                PNode PNew=malloc(sizeof(Node));  
                PNew->data=val;  
                PNew->PNext=NULL;  
                PTail->PNext=PNew;  
                PTail=PNew;  
            }  
            return PHead;  
          
        }  
          
        /** 
        **对链表进行遍历 
        */  
        void traverse(PNode pHead)  
        {  
           PNode p=pHead->PNext;  
           while(p!=NULL)  
           {  
               printf("%d    ",p->data);  
               p=p->PNext;  
           }  
           printf("\n");  
        }  
        /** 
        *判断链表是否为空 
        */  
          
        bool isempty(PNode pHead)  
        {  
            if(NULL==pHead->PNext)  
            {  
                    return true;  
            }else{  
            return false;  
            }  
        }  
          
        /** 
        **获取链表的长度 
        */  
        int list_num (PNode pHead)  
        {  
          int num=0;  
          PNode p=pHead->PNext;  
          while(p!=NULL)  
          {  
              num++;  
              p=p->PNext;  
          }  
          return  num;  
        }  
          
        /** 
        *向链表中插入元素 
        */  
        bool insert_list(PNode pHead,int val ,int pos){  
        //需要找到第pos个位置,并且需要判断这个位置pos是否合法  
         //i是p所指节点的位置,所以从一开始,为什么要pos-1呢,因为用的是while 当i=pos-1时跳出循环  
         int i=0;  
         PNode p=pHead;  
         while(NULL!=p&&i<pos-1)  
         {  
             i++;  
             p=p->PNext;  
         }  
        //如果插入位置过大,那么P=NULL,  
        //如果插入的位置是0或者负数,那么i>pos-1  
        if(i>pos-1||NULL==p)  
         {  
             printf("插入位置不合法\n");  
             return false;  
         }  
        PNode PNew=malloc(sizeof(PNode));  
        PNew->data=val;  
        PNode temp=p->PNext;  
        p->PNext=PNew;  
        PNew->PNext=temp;  
        return true;  
        }  
          
        /** 
        **在链表中删除节点 
        */  
        delete (PNode PHead,int pos , int * pval)  
        {  
            int i=0;  
            PNode p=PHead;  
            //我们要删除p后面的节点,所以p不能指向最后一个节点 p->next!=NULL  
            while(p->PNext!=NULL&&i<pos-1){  
          
                p=p->PNext;  
                i++;  
            }  
            if(i>pos-1||p->PNext==NULL)  
            {  
                printf("删除位置不合法\n");  
             return false;  
            }  
           PNode temp=p->PNext;  
           p->PNext=temp->PNext;  
           free(temp);  
          
          
          
        }  
        int main()  
        {  
          
         PNode PHead= create_list();  
        if(isempty(PHead))  
        printf("链表为空\n");  
        printf("链表的长度为:%d\n",list_num(PHead));  
        traverse(PHead);  
        //insert_list(PHead,55,1);  
        int val;  
         delete(PHead,6,&val);  
        traverse(PHead);  
        return 0;  
        }  




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值