#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<i) /*找到要插入的位置*/ { ++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<i-1) /*找到要删除结点的位置*/ { ++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(); }