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;
}
浙公网安备 33010602011771号