为什么我的链表遍历循环不停止??
求大家帮助。遍历链表时候,程序一直循环不停止。代码如下:#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;
} 。。。 没人回答。。。已自己解决。。。
#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]