qq_41096387 2020-04-09 10:23 采纳率: 100%
浏览 405

C语言 单向链表的遍历问题!

你好,我这个单向链表的遍历函数为什么会一直循环 不停止。代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

struct Node;
typedef struct Node *PNode;//指向下一个struct Node用的 
typedef double DataType;

struct Node{
    DataType info;
    PNode link;//next指针 
}; 

typedef struct Node *LinkList; //单链表类型 的指针 //用这个构建函数  返回变量为struct Node型的指针 

LinkList createNullList_link(void){ 
    /*构建空单链表*/
    LinkList llist = (LinkList)malloc(sizeof(struct Node));
    if(llist!=NULL) llist->link=NULL;
    else printf("构建空的单链表失败\n");
    return llist;
} 

void isNullList_link(LinkList llist){
    /*判断是否为空链表*/
    if(llist->link==NULL){
        printf("是空链表\n");
    } else{
        printf("不是空链表\n"); 
    }

} ;

PNode locate_link(LinkList llist, DataType x){
    /*判断第一个元素x在单链表中存储的位置*/
    PNode p;
    if(llist==NULL) {
        printf("这个是空链表\n"); return NULL; 
    } ;

    p = llist->link;
    while(p!=NULL&&p->info!=x){
        p = p->link;
    };
    printf("找到元素x所存储的位置\n"); 
    return p;//返回p,p指向的是那个节点 
}

int insertPost_Link(LinkList llist, PNode p, DataType x){
    /*在p所指的节点(p已经是个节点了)后面插入新节点,经常与locate_link函数连用,意思实在p之后插入节点*/
    PNode q = (PNode)malloc(sizeof(struct Node));//申请新的节点
    if(q==NULL) {
        printf("新节点构建失败\n"); 
        return 0;
    } else {
        q->info = x;
        q->link = p->link;//q的link指向了原来p的link应该指的节点 
        p->link = q;//原来的p->link 指向了q 节点 
        printf("新节点插入成功\n");
        return 1;
    }       
} 

/*--------------------------------------------------*/
PNode locatePre_link(LinkList llist, PNode p){
    /*求p所指的节点之前的节点,与函数locate_link连用*/
    PNode p1;
    if(llist==NULL) {
        printf("这是空的链表\n"); 
        return NULL;
    }
    p1 = llist;
    while(p1!=NULL && p1->link != p){
        p1 = p1->link;
    }
    printf("找到了\n"); 
    return p1;  
} 

void insertPre_Link(LinkList llist, PNode p, DataType x){
    /*在p 所指的 节点 前面插入新节点,与locatePre_link连用*/
    PNode q = (PNode)malloc(sizeof(struct Node));//申请新的节点
    if(q==NULL) {
        printf("新节点构建失败\n"); 
    } else {
        q->info = x;
        q->link = p->link;//q的link指向了原来p的link应该指的节点 
        p->link = q;//原来的p->link 指向了q 节点 
        printf("新节点插入成功\n");
    }   
} 
/*-------------------------------------------------------------------*/

int deleteV_link(LinkList llist, DataType x){
    /*删除第一个元素值为x的节点*/
    PNode p, q;
    p = llist;
    if(p==NULL){
        printf("这是个空链表\n"); return 0; 
    } 

    while(p->link!=NULL && p->link->info!=x){
        /*p->link所指的节点的数据不等于x*/
        p = p->link;
    }

    if(p->link == NULL){
        printf("不存在这个存储元素的节点\n"); return 0;
    } else{
        q = p->link ;
        p->link = q->link ;
        free(q);
        printf("删除成功\n");
        return 1;
    }
} 

int deleteP_link(LinkList llist, PNode p){
    /*删除p所指的节点*/

    if(llist==NULL){
        printf("这是个空链表\n"); return 0; 
    }   

    PNode p1;
    p1 =  locatePre_link(llist, p);
    p1->link = p->link ;
    free(p);
    printf("删除成功\n"); 
    return 1;

}

void DisplayList(LinkList head){
    //遍历带头结点的单链表
    LinkList p = head;
    if(head == NULL){
            printf("这是个空链表\n");
    }
    int i = 0;
    for (i =0;;i++){
        if(p->info==-1) break;
        printf("%lf ",p->info );
        p = p->link; 
    }

    printf("\b\n");
}
/*--------------------------*/
int main()
{
    LinkList head,q,tail;
    q = createNullList_link();
    head = q;
    tail = q;
    isNullList_link(q); 

    double info_1 = 0;
    printf("请输入第一个节点的元素:\n");
    scanf("%lf", &info_1);
    q->info = info_1;
    head = q;
    q->link = tail;
    tail == NULL;
    isNullList_link(q); 

    PNode t = q; 
    int i;
    printf("请输入你要插入的元素,并以-1结束\n");
    for(i = 0;; i ++ ){
        double x = 0.0;

        scanf("%lf",&x);
        if(x==-1) break; 
        int y = insertPost_Link(q,t,x);
        t = t->link;            
    } 
    DisplayList(head);

    printf("运行完毕,按任意键退出\n");
    system("pause");
    return 0;
}
  • 写回答

1条回答 默认 最新

  • 梧桐树✯ 2020-04-09 13:59
    关注

    typedef struct __NODE
    {
    int data;
    struct __NODE *next;
    }NODE;

    typedef struct __LIST
    {
    NODE *head;//表头
    }LIST;

    /*

    • 函 数 名: ergodicList
    • 功能说明: 遍历整个链表
    • 形 参: *List 指向需要遍历链表的指针
    • 返 回 值: 无
      */
      void ergodicList(LIST *List)
      {
      NODE *ptrHead = List->head;// 指向链表表头

      if (!ptrHead)
      {
      printf("空链表\n");
      return;
      }

      while(ptrHead)// 下一个结点存在 即不为空
      {
      printf("%d ", ptrHead->data);// 打印指向当前结点数据
      ptrHead = ptrHead->next;// 把指向当前结点的指针指向该结点的下一个结点的地址
      }
      printf("\n");
      }

    仅供参考!!

    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?