#include "stdio.h"
typedef struct lnode /*定义节点类型*/
{
char data; /*数据域*/
struct lnode *next; /*指针域*/
}lnode;
/*函数名称:creat*/
/*功能描述:生成单链表*/
/*返回类型:无返回值*/
/*函数参数: h:单链表头指针*/
void creat(lnode *h)
{
lnode *t,*p;
char ch;
t=h;
while((ch=getchar())!='\n')
{
/*尾插法建立链表*/
p=(lnode*)malloc(sizeof(lnode)); /*生成新结点p,并分配内存空间*/
p->data=ch;
p->next=NULL; /*p的指针域为空*/
t->next=p; /*p的next指向这个结点*/
t=p; /*t指向这个结点*/
}
}
/*函数名称:print*/
/*功能描述:遍历单链表*/
/*返回类型:无返回值*/
/*函数参数:h:单链表头指针*/
void print(lnode *h)
{
lnode *p;
p=h->next;
while(p)
{
printf("%c",p->data); /*输出p的数值域*/
p=p->next; /*p指向下一结点*/
}
}
/*函数名称:length*/
/*功能描述:求单链表长度*/
/*返回类型:无返回值*/
/*函数参数:h:单链表头指针*/
void length(lnode *h)
{
lnode *p;
int i=0; /*记录链表长度*/
p=h->next;
while(p!=NULL) /*循环,直到p指向空*/
{
i=i+1;
p=p->next; /*p指向下一结点*/
}
printf(" %d",i); /*输出p所指接点的数据域*/
}
/*函数名称:insert*/
/*功能描述:插入函数*/
/*返回类型:整型*/
/*函数参数:h:单链表头指针 x:要插入的元素 i:要插入的位置*/
int insert(lnode *h,char x,int i)
{
lnode *p,*s;
int j;
p=h->next; /*此时p为首指针*/
j=1;
while(p&&j {
++j;
p=p->next; /*p指向下一结点*/
}
if(i>0&&j==i)
{
s=(lnode*)malloc(sizeof(lnode)); /*生成新结点s,并分配内存空间*/
s->data=x; /*把x赋值给s的数据域*/
s->next=p->next; /*s指向p的下一结点*/
p->next=s; /*p指向s*/
return(1); /*如果成功返回1*/
}
else
return(0); /*如果失败就返回0*/
}
/*函数名称:delete_*/
/*功能描述:删除函数*/
/*返回类型:整型*/
/*函数参数:h:单链表头指针 i:要删除的位置*/
int delete_(lnode *h,int i)
{
lnode *p,*q;
int j;
p=h->next; /*此时p为首结点*/
j=1;
while(p&&j {
++j;
p=p->next;
}
if(i>0&&j==i-1)
{
q=p->next; /*q指向要删除结点的结点*/
p->next=q->next;/*p的下一个结点为q的的下一个结点*/
free(q); /*释放q的空间*/
return(1); /*如果成功返回1*/
}
else
return(0); /*如果失败就返回0*/
}
/*函数名称:locate_*/
/*功能描述:查找函数*/
/*返回类型:整型*/
/*函数参数:h:单链表头指针 x:要查找的值*/
void locate(lnode *h,char x)
{
lnode *p;
p=h->next; /*此时p为首结点*/
while(p!=NULL&&p->data!=x) /*进入循环,直到p为空,或找到x*/
p=p->next; /*s指向p的下一结点*/
if(p!=NULL)
{
printf("seccess!\n");
printf("You want lookup the node is: %c",p->data); /*输出查找的值*/
}
else
printf("Cann't lookup the node!\n");
}
/*主函数*/
void main()
{
int i,j,k;
char x,y;
lnode *h;
h=(lnode*)malloc(sizeof(lnode)); /*定义头结点,并分配空间*/
h->next=NULL; /*h指向空*/
printf("please input a link:\n");
creat(h); /*调用建立链表函数*/
/*功能选择菜单*/
while(1)
{
printf("\n");
printf("\n");
printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
printf("+++========= 1.show the link ===============================================++++");
printf("+++========= 2.show the link's long ========================================++++");
printf("+++========= 3.insert a node ===============================================++++");
printf("+++========= 4.delete a node ===============================================++++");
printf("+++========= 5.find a node =================================================++++");
printf("+++========= 6.exit ========================================================++++");
printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
printf("\n");
printf("please choice(1-6):");
scanf("%d",&i); /*功能选择变量*/
if(i<0||i>7)
printf("please right choice!\n");
if(i==1)
{
printf("The link's node is:");
print(h); /*调用输出函数*/
}
if(i==2)
{
printf("\nThe link's long is:");
length(h); /*调用求长度函数*/
printf("\n");
}
if(i==3)
{
getchar();
printf("please input new node:");
x=getchar();
printf("\nplease input new node's place:");
scanf("%d",&j);
insert(h,x,j); /*调用插入函数*/
}
if(i==4)
{
printf("please input the please that you want locate:\n");
scanf("%d",&k);
delete_(h,k); /*调用删除函数*/
}
if(i==5)
{
getchar();
printf("please input the node that you want lookup:");
y=getchar();
locate(h,y); /*调用查找函数*/
}
if(i==6)break;
}
printf("\n Press any key to quit...");
getch();
}