删除单链表(带头结点)的最小值结点

来源:互联网 发布:朱清时量子意识 知乎 编辑:程序博客网 时间:2024/05/22 06:50

题目:如题;
结果:
这里写图片描述

———-代码区

#include <stdio.h>#include <stdlib.h>#define ERROR NULLtypedef enum {false, true} bool;typedef int ElementType;typedef struct LNode *PtrToLNode;struct LNode {    ElementType Data;    PtrToLNode Next;};typedef PtrToLNode Position;typedef PtrToLNode List;List MakeEmpty();bool Insert( List L, ElementType X, Position P );void deleteMinNode(List L);int main(){    List L;    ElementType X;    Position P;    int N;    L = MakeEmpty();    scanf("%d", &N);    while ( N-- ) {        scanf("%d", &X);        Insert(L, X, L->Next);    }    printf("before delete:\n");    for ( P=L->Next; P; P = P->Next ) printf("%d ", P->Data);    printf("after delete:\n");    deleteMinNode(L);    for ( P=L->Next; P; P = P->Next ) printf("%d ", P->Data);    return 0;}List MakeEmpty(){    List L =(List)malloc(sizeof(struct LNode));    L->Next = NULL;    return L;}/* 带头结点的插入 注意这里是倒序插入,测试的时候输入数据的时候要小心一下*/bool Insert( List L, ElementType X, Position P ){ /* 这里默认L有头结点 */    Position temp, pre;    /* 查找P的前一个结点,这里最开始没想到for循环不需要写循环体内程序就可以了 */    for ( pre=L; pre&&pre->Next!=P; pre=pre->Next ) ;    if ( pre==NULL ) { /* P所指的结点不在L中 */        printf("Wrong Position for Insertion\n");        return false;    }    else { /* 找到了P的前一个结点pre */        /* 在P前插入新结点 */        temp = (Position)malloc(sizeof(struct LNode)); /* 申请、填装结点 */        temp->Data = X;        temp->Next = P;        pre->Next = temp;        //刚开始忘记写return true;        return true;    }}/*犯了几个错:    1、while循环的条件是while(cur != NULL ),不是while(cur->Next != NULL),如果用后者,那么最后一个结点的值没比较就被跳过了    2、要用到四个指针,否则不行:        第一,删除一个结点,必须要记录被删除结点的前驱;        第二,要用一个临时变量记录待删除的结点,这样才能free掉待删除的结点;        第三,要遍历结点,所以需要一个变量保存指针;        第四,保存遍历结点的前驱,以便赋给第一点;*/void deleteMinNode(List L){    if(L == NULL) return;    List cur = L->Next,curPre = L,min = L->Next, minPre;    while(cur!= NULL){        if(cur->Data < min->Data){            minPre = curPre;            min = cur;        }        curPre = cur;        cur = cur->Next;    }    minPre->Next = min->Next;    free(min);}
0 0
原创粉丝点击