list链表 自定义链表

List是一个线性链表结构,它的数据由若干个节点构成,每一个节点都包括一个信息块(即实际存储的数据)、一个前驱指针和一个后驱指针。它无需分配指定的内存大小且可以任意伸缩,这是因为它存储在非连续的内存空间中,并且由指针将有序的元素链接起来。

List 的特点:

(1) 不使用连续的内存空间这样可以随意地进行动态操作;

(2) 可以在内部任何位置快速地插入或删除,当然也可以在两端进行push和pop 。

(3) 不能进行内部的随机访问,即不支持[ ] 操作符和vector.at() ;


成员 empty() 如果list是空的则返回true

自定义链表

mylist.h

#pragma once
typedef  struct student{
    int num;
    float score;
    struct student *pNext;
}Student_t,*pStudent_t;

void insertHead(pStudent_t *,pStudent_t *,int val);
void insertTail(pStudent_t *,pStudent_t *,int val);
void insertSort(pStudent_t *,pStudent_t *,int val);
void printList(pStudent_t stu);
void listDelete(pStudent_t *,pStudent_t *,int val);
void listModify(pStudent_t,int,float);     

mylist.c

#include "list.h"
#include <stdio.h>                                                                                          
#include <stdlib.h>
void insertHead(pStudent_t *pHead,pStudent_t *pTail,int val){
    pStudent_t pNew = (pStudent_t)calloc(1,sizeof(Student_t));
    pNew->num = val;
    if(NULL == *pHead)
    {
        *pHead = pNew;
        *pTail = pNew;
    }else{
        pNew->pNext = *pHead;
        *pHead = pNew;
    }
}
void insertTail(pStudent_t *pHead,pStudent_t *pTail,int val){
    pStudent_t pNew = (pStudent_t)calloc(1,sizeof(Student_t));
    pNew->num = val;
    if(NULL == *pHead)
    {
        *pHead = pNew;
        *pTail = pNew;
    }else{
        (*pTail)->pNext = pNew;
        *pTail = pNew;
    }
}
void insertSort(pStudent_t *pHead,pStudent_t *pTail,int val){
    pStudent_t pNew = (pStudent_t)calloc(1,sizeof(Student_t));
    pNew->num = val;

    pStudent_t pPre,pCur=*pHead;

    if(NULL == *pHead)
    {
        *pHead = pNew;
        *pTail = pNew;
    }else{
        if(val < pCur->num)
        {
            pNew->pNext = *pHead;
            *pHead = pNew;
        }else{
            while(pCur)
            {
                if(val < pCur->num)
                {
                    pPre->pNext = pNew;
                    pNew->pNext = pCur;
                    break;
                }
                pPre = pCur;
                pCur = pCur->pNext;
            }
            if(NULL == pCur)
            {
                (*pTail)->pNext = pNew;
                *pTail = pNew;
            }
        }
    }

}
void printList(pStudent_t stu){
    while(stu)
    {
        printf("%d %5.2f\n",stu->num,stu->score);
        stu = stu->pNext;
    }
    printf("\n");
}
void listDelete(pStudent_t *pHead,pStudent_t *pTail,int val){
    pStudent_t pCur = *pHead,pPre = *pHead;
    if(NULL == pHead)
    {
        printf("链表为空\n");
        return;
    }else if(pCur->num == val)
    {
        *pHead = pCur->pNext;
        if(NULL == *pHead)
        {
            *pTail = NULL;
        }
    }else{
        while(pCur)
        {
            if(val == pCur->num)
            {
                pPre->pNext = pCur->pNext;
                break;
            }
            pPre = pCur;
            pCur = pCur->pNext;
        }
        if(NULL == pCur)
        {
            printf("Don't find deleteNum\n");
            return;
        }
        if(pCur == *pTail)
        {
            *pTail = pPre;
        }
    }
            free(pCur);
            pCur = NULL;
}
void listModify(pStudent_t pHead,int num,float score){
   while(pHead)
   {
       if(pHead->num == num)
       {
           pHead->score = score;
           break;
       }
       pHead = pHead->pNext;
   }
   if(NULL == pHead)
   {
       printf("Don‘t find modify num\n");
   }
}

main.cpp

  #include <iostream>          
  #include "list.h"            
  
  void func()
  { 
      int num,index;
      float score;             
      pStudent_t pHead = NULL,pTail=NULL;
  
      while(scanf("%d",&num)!= EOF)   
      {
✹         if(index++ >= 10)
          {
              break;
          }
  
          //insertHead(&pHead,&pTail,num);
          //insertTail(&pHead,&pTail,num);
          insertSort(&pHead,&pTail,num);  
      }
      printList(pHead);
      fflush(stdout);
  #if 0
      while(printf("please input delete num:"),fflush(stdout),scanf("%d",&num)!=EOF)
      {
          listDelete(&pHead,&pTail,num);
          printList(pHead);
      }
  #endif
      while(printf("please input modify num and score:"),fflush(stdout),scanf("%d%f",&num,&score)!=EOF)
      {
          listModify(pHead,num,score);    
          printList(pHead);                                                                                 
      }
  
  
  }
  
  int main()
  {
      func();
      return 0;
  }

posted on 2021-06-20 17:41  lodger47  阅读(63)  评论(0)    收藏  举报

导航