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

向右看齐 2023-10-17 23:54 241阅读 0赞

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

王道19数据结构 P44
删除带头结点的单链表最小值结点(假设最小值结点唯一)

书上给的答案无法应对单链表为空的情况
因为指针为空时,无法访问其结构体成员

课本代码

  1. LinkList DelMin(LinkList &L){
  2. LNode *pre = L, *p=pre->next; //L==NULL时此处报错
  3. LNode *minpre = pre, *min = p;
  4. while (p != NULL){
  5. if (p->data < min->data){
  6. min = p;
  7. minpre = pre;
  8. }
  9. pre = p;
  10. p = p->next;
  11. }
  12. minpre->next = min->next; //L->next==NULL时此处报错
  13. free(min);
  14. return L;
  15. }

改进代码

加入空链表判断

  1. LinkList DelMin(LinkList &L){
  2. if (L == NULL){
  3. return NULL;
  4. }
  5. if (L ->next == NULL){
  6. return NULL;
  7. }
  8. LNode *pre = L, *p=pre->next;
  9. LNode *minpre = pre, *min = p;
  10. while (p != NULL){
  11. if (p->data < min->data){
  12. min = p;
  13. minpre = pre;
  14. }
  15. pre = p;
  16. p = p->next;
  17. }
  18. minpre->next = min->next;
  19. free(min);
  20. return L;
  21. }

结构体定义

  1. typedef char ElemType;
  2. typedef struct LNode{
  3. ElemType data;
  4. struct LNode *next;
  5. }LNode, *LinkList;

打印单链表

  1. void printList(LinkList &L){
  2. LNode *p = L;
  3. if (p == NULL){
  4. printf("NULL1");
  5. }
  6. else if (p->next == NULL){
  7. printf("NULL2");
  8. }
  9. else{
  10. while (p != NULL){
  11. printf("%c ", p->data);
  12. p = p->next;
  13. }
  14. }
  15. printf("\n");
  16. }

头文件及主函数

  1. #include <iostream>
  2. void main(){
  3. LNode *Head = (LNode*)malloc(sizeof(LNode)); //头结点
  4. LNode *A = (LNode*)malloc(sizeof(LNode));
  5. LNode *B = (LNode*)malloc(sizeof(LNode));
  6. LNode *C = (LNode*)malloc(sizeof(LNode));
  7. LNode *D = (LNode*)malloc(sizeof(LNode));
  8. LNode *E = (LNode*)malloc(sizeof(LNode));
  9. LNode *F = (LNode*)malloc(sizeof(LNode));
  10. LNode *G = (LNode*)malloc(sizeof(LNode));
  11. LNode *H = (LNode*)malloc(sizeof(LNode));
  12. LNode *I = (LNode*)malloc(sizeof(LNode));
  13. Head->data = '>'; Head->next = A;
  14. A->data = 'A'; A->next = B;
  15. B->data = 'B'; B->next = C;
  16. C->data = 'C'; C->next = D;
  17. D->data = 'D'; D->next = E;
  18. E->data = 'E'; E->next = F;
  19. F->data = 'F'; F->next = G;
  20. G->data = 'G'; G->next = H;
  21. H->data = 'H'; H->next = I;
  22. I->data = 'I'; I->next = NULL;
  23. LinkList L = (LinkList)malloc(sizeof(LNode));
  24. L = Head;
  25. //L->next = NULL;
  26. //L = NULL;
  27. DelMin(L);
  28. printList(L);
  29. }

发表评论

表情:
评论列表 (有 0 条评论,241人围观)

还没有评论,来说两句吧...

相关阅读