qq1012510777 发表于 2020-4-9 12:04:39

为什么我的链表遍历循环不停止??

求大家帮助。遍历链表时候,程序一直循环不停止。代码如下:
#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;
}

qq1012510777 发表于 2020-4-9 12:35:09

。。。

qq1012510777 发表于 2020-4-9 12:55:43

没人回答。。。已自己解决。。。
#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 tail){
        //遍历带头结点的单链表
        LinkList p = head;
        if(head == NULL){
                        printf("这是个空链表\n");
        }
        int i = 0;
        while((p->link== tail)==0){
                printf("%lf ",p->info );
                p = p->link;
        }

       
        printf("%lf\n", p->info);
}
/*--------------------------*/
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) {
                        t->link = tail;
                        break;
                }
                int y = insertPost_Link(q,t,x);
                t = locate_link(q,x);                       
        }
       
       
        DisplayList(head,tail);
       
        printf("运行完毕,按任意键退出\n");
        system("pause");
        return 0;
}
页: [1]
查看完整版本: 为什么我的链表遍历循环不停止??