list.h
#include <stdio.h>
#include<stdlib.h>
typedef struct student {
int num;
float score;
struct student *pNextStu;
}student_t,*pStudent_t;
//链表头插法方法的声明
void ListHeadInsert(pStudent_t* pphead, pStudent_t * pptail, int val);
//链表尾插法方法的声明
void ListTailInsert(pStudent_t* pphead, pStudent_t * pptail, int val);
//顺序插入法
void ListSortInsert(pStudent_t* pphead, pStudent_t* pptail, int val);
//删除一个元素
void ListDelte(pStudent_t*, pStudent_t*, int);
//链表打印方法的声明
void ListPrint(pStudent_t head);
//修改链表中的元素
void ListModify(pStudent_t, int, float);
list.c
#include "list.h"
//链表头头插法
void ListHeadInsert(pStudent_t*pphead, pStudent_t*pptail,int val) {
pStudent_t pNew = (pStudent_t)calloc(1, sizeof(student_t));
pNew->num = val;
if (NULL==*pphead) {
*pphead = *pptail = pNew;
}
else {
pNew->pNextStu = *pphead;
*pphead = pNew;
}
}
//链表尾插法
void ListTailInsert(pStudent_t* pphead, pStudent_t* pptail, int val) {
pStudent_t pNew = calloc(1, sizeof(student_t));
pNew->num = val;
if (NULL==*pphead) {
*pphead = *pptail = pNew;
}
else {
(*pptail)->pNextStu = pNew;
*pptail = pNew;
}
}
//顺序插入法
void ListSortInsert(pStudent_t *pphead,pStudent_t *pptail,int val) {
pStudent_t pNew = (pStudent_t)calloc(1, sizeof(student_t));
pNew->num = val;
pStudent_t pCur = *pphead;
pStudent_t pPre = *pphead;
if (NULL == *pphead) {
*pphead = *pptail = pNew;
}
else if (val<pCur->num) {//当插入的数小于头元素时,直接用头插法
pNew->pNextStu = *pphead;
*pphead=pNew;
}
else {
while (pCur) {
if (val < pCur->num) {//当插入的数小行循环遍历的pCur时,将插入到pPre和pCur中间
pPre->pNextStu = pNew;
pNew->pNextStu = pCur;
break;
}
pPre = pCur;
pCur = pCur->pNextStu;
}
//如果pCur的值为NULL时,则表示没有执行过将元素插入到pPre和pCur中间的操作
//即val比所有元素都要大,此时直接用尾插法
if (NULL == pCur) {
(*pptail)->pNextStu = pNew;
*pptail = pNew;
}
}
}
//删除链表中的一个元素
void ListDelte(pStudent_t* pphead, pStudent_t* pptail, int deleteNum) {
pStudent_t pCur = *pphead;
pStudent_t pPre = *pphead;
if (NULL == pCur) {//当pCur的值为NULL时,则代表链表为空
printf("List is empty!\n");
}
else if (deleteNum==pCur->num) {//当删除的值为头节点时
(*pphead) = pCur->pNextStu;//将头指针指向下一个节点
if (NULL == (*pphead)) {//判断链表删除这个元素后是否为空,为空则尾指针也需要置为NULL
*pptail = NULL;
}
}
else {
while (pCur) {
if (pCur->num == deleteNum) {//当删除除头节点以外的节点时
pPre->pNextStu = pCur->pNextStu;
break;
}
//pCur指向下一个节点
pPre = pCur;
pCur = pCur->pNextStu;
}
//当没有找到需要删除的节点时,pCur的值为NULL
if (pCur == NULL) {
printf("deletenum is not found!\n");
}
//当pCur的值和*pphead的值相等时,代表删除的是尾节点,故需要改变尾结点
if (pCur==*pphead) {
*pptail = pPre;
}
}
free(pCur);
pCur = NULL;
}
//链表打印
void ListPrint(pStudent_t head) {
while (head) {
printf("%5d\t %5.2f\n",head->num,head->score);
head = head->pNextStu;
}
printf("\n");
}
//修改链表中的元素
void ListModify(pStudent_t head,int num, float score) {
while (head) {
if (head->num==num) {
head->score = score;
break;
}
head = head->pNextStu;
}
if (NULL == head) {
printf("Dont't find the modified number !\n");
}
}
main.c
#include "list.h"
int main() {
int num;
pStudent_t head, tail;
head = tail = NULL;
float score;
while (scanf("%d",&num)!=EOF) {
//ListHeadInsert(&head, &tail, num);//头插法
//ListTailInsert(&head, &tail, num);//尾插法
ListSortInsert(&head, &tail, num);
}
ListPrint(head);
//while (printf("please input delete num:"), fflush("stdout"),scanf("%d",&num)!=EOF) {
// ListDelte(&head,&tail,num);
// ListPrint(head);
//}
// 刷新标准输出,将字符串打印出来
while (printf("please input score :"), fflush("stdout"), scanf("%d%f", &num,&score) != EOF) {
ListModify(head, num, score);
ListPrint(head);
}
system("pause");
}