![]() |
#2
海莲2012-10-23 14:14
|

#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);
}
#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);
}