#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define N 3
typedef struct node
{
char name[20];
struct node *link;
}stud;
命名这个多结构体一个新的称号为stud。
stud * creat(int n) /*建立单链表的函数*/
{
stud *p,*h,*s;
inti;
if((h=(stud *)malloc(sizeof(stud)))==NULL)
{
printf("不能分配内存空间!");
exit(0);
}
h->name[0]='\0';
h->link=NULL;
p=h;
把h的地址给p如果h的动态内存为空则显示不能分配内存清空h的name属性h的下一项为空
for(i=0;i<N;i++)
{
if((s= (stud *) malloc(sizeof(stud)))==NULL)
{
printf("不能分配内存空间!");
exit(0);
}
如果s的内存为空则显示不能分配内存
p->link=s;
printf("请输入第%d个人的姓名:",i+1);
scanf("%s",s->name);
s->link=NULL;
p=s;
}
p向s提出分配,把s的name给p。s的下一个指针地址为空,永远保证是最后一个。而且一定要让p的下一个link得到s的值。
return(h);
}
stud * search(stud *h,char *x) /*查找函数*/
{
stud *p;
char *y;
p=h->link;
while(p!=NULL)
{
y=p->name;
if(strcmp(y,x)==0)
return(p);
else p=p->link;
}
把头指针的下一项给p如果p为空,y获得p中name的值,然后让y和x比较,如果x和y的值相同也就是等于0.就证明找到了,否则就让p得到它的下一个指针数。再次重复,让y获得p的地址中name的地址。如果最后还是没有的话,说明并没有这个数据,显示没有。
if(p==NULL)
printf("没有查找到该数据!");
}
stud *search2(stud *h,char *x)
{
stud *p,*s;
char *y;
p=h->link;
s=h;
while(p!=NULL)
{
y=p->name;
if(strcmp(y,x)==0)
return(s);
else
{
p=p->link;
s=s->link;
}
}
头指针 的link指针给p,h的值赋予给s当p不等于空时,y得到p地址的名字 ,两者比较如果y和x相同说明找到了人,如果没有就返还,找到p就得到向下一个继续,s也得到下一个P。然后循环在进行比较。
if(p==NULL)
printf("没有查找到该数据!");
}
void insert(stud *p) /*插入函数,在指针p后插入*/
{
char stuname[20];
stud *s; /*指针s是保存新结点地址的*/
if((s= (stud *) malloc(sizeof(stud)))==NULL)//新定义的s指针的动态分配在stud中如果为空就表示不可分配空间显示退出,如果不为空就证明有空间可以使用。设定stuname的值然后让s获取,在把p的下一个给s的下一个,然后s给p的下一个。
{
printf("不能分配内存空间!");
exit(0);
}
printf("请输入你要插入的人的姓名:");
scanf("%s",stuname);
strcpy(s->name,stuname);
s->link=p->link; /*把新结点的链域指向原来p结点的后继结点*/
p->link=s;/*p结点的链域指向新结点*/
}
设定stuname的值然后让s获取,在把p的下一个给s的下一个,然后s给p的下一个。如果动态内存分配为空则退出。
才用插空取值的方法,把上一个数提前给要插入的数,完成传递,否则会丢失。
void del(stud *x,stud *y)
{
stud*s;
s=y;
x->link=y->link;
free(s);
}
把要被删掉的数先给后面,然后在进行前向传递,把Y的后方的值给Y的前方,这样Y就没用了最后在清除掉S就算完成了删除任务。
void print(stud *h)
{
stud *p;
p=h->link;
printf("数据信息为:\n");
while(p!=NULL)
{
printf("%s \n",&*(p->name));
p=p->link;
}
}
void quit()
{
exit(0);
}
void menu(void)
{
system("cls");
printf("\t\t\t单链表C语言实现实例\n");
printf("\t\t|----------------|\n");
printf("\t\t| |\n");
printf("\t\t| [1] 建 立 新 表 |\n");
printf("\t\t| [2] 查 找 数 据 |\n");
printf("\t\t| [3] 插 入 数 据 |\n");
printf("\t\t| [4] 删 除 数 据 |\n");
printf("\t\t|[5] 打 印 数 据 |\n");
printf("\t\t| [6] 退 出 |\n");
printf("\t\t| |\n");
printf("\t\t| 如未建立新表,请先建立! |\n");
printf("\t\t| |\n");
printf("\t\t|----------------|\n");
printf("\t\t 请输入你的选项(1-6):");
}
main()
{
int choose;
stud *head,*searchpoint,*forepoint;
char fullname[20];
while(1)
{
menu();
scanf("%d",&choose);
switch(choose)
{
case 1:
head=creat(N);
break;
case 2:
printf("输入你所要查找的人的姓名:");
scanf("%s",fullname);
searchpoint=search(head,fullname);
printf("你所查找的人的姓名为:%s",*&searchpoint->name);
printf("\n按回车键回到主菜单。");
getchar();getchar();
break;
case 3: printf("输入你要在哪个人后面插入:");
scanf("%s",fullname);
searchpoint=search(head,fullname);
printf("你所查找的人的姓名为:%s",*&searchpoint->name);
insert(searchpoint);
print(head);
printf("\n按回车键回到主菜单。");
getchar();getchar();
break;
case 4:
print(head);
printf("\n输入你所要删除的人的姓名:");
scanf("%s",fullname);
searchpoint=search(head,fullname);
forepoint=search2(head,fullname);
del(forepoint,searchpoint);
break;
case 5:
print(head);
printf("\n按回车键回到主菜单。");
getchar();getchar();
break;
case 6:quit();
break;
default:
printf("你输入了非法字符!按回车键回到主菜单。");
system("cls");
menu();
getchar();
最后运用了“选择” ,保证是一个死循环,这样界面就会无限刷新,然后在阻挡函数,这样就可以选择了,否则无法选择。
}
}
}