鱼C论坛

 找回密码
 立即注册
查看: 1518|回复: 2

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

[复制链接]
发表于 2020-4-9 12:04:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求大家帮助。遍历链表时候,程序一直循环不停止。代码如下:
#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-9 12:35:09 | 显示全部楼层
。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 13:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表