写的静态链表在插入后输出陷入死循环,但是在未插入前输出不会,不知道哪里错了,大家给看看帮帮忙
程序代码:
#include<stdio.h> #define MAXSIZE 100 typedef int datatype; typedef struct node { datatype data; int link; }snode; typedef struct { snode nodes[MAXSIZE]; int newptr; }slinklist; slinklist a; void initlist(slinklist *sl) //初始化 { int i; (*sl).nodes[0].link=1; (*sl).newptr=1; for(i=1;i<MAXSIZE-1;i++) { (*sl).nodes[i].link = i + 1; } (*sl).nodes[MAXSIZE-1].link=-1; } void ceratlist(slinklist *sl) //创建 { int i=1,j; printf("请输入数据到-1时结束:\n"); scanf("%d",&j); while(j!=-1) { sl->nodes[i].data=j; i++; sl->newptr++; if(i>MAXSIZE-1) break; scanf("%d",&j); } sl->nodes[i].link=-1; } int find(slinklist sl,datatype x) //按值查找 { int p=sl.nodes[0].link; int m=0; if(sl.nodes[1].data==x) return 1; while(p!=-1) if(sl.nodes[p].data!=x) { p=sl.nodes[p].link; m++; } else break; if(m) return p; else return m; } int locate(slinklist sl,int i) //按结点查找 { int j=0,p=0; if(i<0) return -1; while(p!=-1&&j<i) { p=sl.nodes[p].link; j++; } if(i==0) return 0; return p; } int insert(slinklist * sl,int i,datatype x) //在静态链表第I个结点处插入一个新结点 { int j=0,p=0,q; if(i<=0) { printf("位置不正确!"); return 0; } while(j<i-1&&sl->nodes[p].link!=-1) { p=sl->nodes[p].link; j++; } if(j!=i-1&&sl->nodes[p].link==-1) { printf("位置不正确!"); return 0; } else { q=sl->newptr; sl->newptr=sl->nodes[sl->newptr].link; sl->nodes[q].data=x; sl->nodes[q].link=sl->nodes[p].link; sl->nodes[p].link=q; return 1; } } //移除 int remove_l(slinklist *sl,int i) { int p,q; p=locate((*sl),i-1); q=sl->nodes[p].link; if(p==-1) return 0; else { sl->nodes[p].link=sl->nodes[q].link; sl->nodes[q].link=sl->newptr; sl->newptr=q; return 1; } } void output(slinklist sl) { int i,q; i=0;q=1; printf("输出数据:\n"); while(sl.nodes[q].link!=-1) { printf("%d\t",sl.nodes[q].data); q=sl.nodes[q].link; i++; if(i%5==0) printf("\n"); } } int leng(slinklist sl) { int m,n=0; } int menu() { int n; printf("\n\n\n\t\t\t------请选择操作------\n\t\t\t\t1:输出\n\t\t\t\t2:按值查找\n\t\t\t\t3:结点查找\n\t\t\t\t4:插入\n\t\t\t\t5:按结点删除\n\t\t\t\t6:按值删除\n\t\t\t\t7:静态链表长度\n\t\t\t\t0:退出\n"); do { fflush(stdin); printf("\n\n\t\t请输入数字0-7选择功能:"); scanf("%d",&n); if(n<0||n>7) printf("\t\t\t输入选择有错!请重新输入选项"); }while(n<0||n>7); return n; } int main() { int c,i,d,m,n; m=0;n=0; initlist(&a); ceratlist(&a); do { system("cls"); /*清屏*/ d=menu(); switch(d) { case 1: output(a);break; case 2: printf("请输入需要查询的值:"); scanf("%d",&c); printf("\n"); i=find(a,c); if(i==-1) printf("查找失败,请重试!\n"); else printf("查找成功,数据在第%d位。\n",i); break; case 3: printf("请输入要查找的结点:"); scanf("%d",&c); i=locate(a,c); if(i<=0) printf("查找失败,请重试!\n"); else printf("查找成功,该结点数据为%d。\n",a.nodes[i].data); break; case 4: printf("请输入要插入结点的位置和数据(a,b):"); scanf("%d,%d",&i,&c); d=insert(&a,i,c); if(d==0) printf("插入失败,请重试!\n"); else printf("插入成功!\n"); output(a); break; case 5: printf("请输入需要删除的结点:"); scanf("%d",&c); d=remove_l(&a,c); if(d==0) printf("删除失败,请重试!\n"); else printf("删除成功!\n"); output(a); break; case 6: printf("请输入需要删除的数据:"); scanf("%d",&c); i=find(a,c); d=remove_l(&a,i); if(d==0) printf("删除失败,请重试!\n"); else printf("删除成功!\n"); output(a); break; case 7: while(a.nodes[n].link!=-1) { n=a.nodes[n].link; m++; } printf("链表长度为:%d\n",m-1);break; case 0: printf("\n\n\n\t\t\t谢谢使用!\n"); exit(0); } getch(); system("cls"); }while(d!=0); }