一:typedef的用法。
写一个数据结构(计算机存储数据的一种方式,是抽象的,可以人为组织,提高算法效率),我们需要注意:接口友好,模块化,规范命名等方面,在接口友好方面,typedef是非常好用并且标准及人性化的。
/*定义一个叫student的结构体*/
struct student
{
int Id;
char name[20];
};
struct student stu1,stu2; //定义了2个名字分别为stu1和stu2的结构体
struct student *stu; //定义一个指向stu的4字节的指针
typedef struct student * head; //将struct student * 定义为 head
head h; //直接用head 就可以定义头指针
二:单向链表的查找、增加、删除、销毁。
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct student)
struct student
{
int Id;
char name[20];
struct student *next;
};
typedef struct student * head; //用typedef 以后我定义指针就直接用head了。
head Input(head h);
head Delete();
int Ruin(head h);
void Print();
head Find();
void biaotou();
void biaotou()
{
printf("\n 信息表\n");
printf("学生编号\t学生姓名\n");
}
head Find(head h)
{
int Id;
head p;
printf("请输入学生编号\n");
scanf("%d",&Id);
for(p = h ;p->next;p = p->next) //查找过程
{
if(p->next->Id == Id) //为什么直接用p->next->Id ,
//原因是返回要找的前驱节点,以后删除和增加的时候都有好处。
{
biaotou();
printf("%d\t\t%s\n",p->next->Id,p->next->name);
break;
}
}
if(p->next == NULL)
{
printf("没有此学号\n");
}
return(p);
}
void Print(head h)
{
head p;
printf("\n 信息表\n");
printf("学生编号\t学生姓名\n");
for(p = h->next; p; p = p->next) //显示的时候直接显示p->next
printf("%d\t\t%s\n",p->Id,p->name);
}
int Ruin(head h)
{
head p = NULL;
int choice;
printf("确定销毁整个链表?(1:销毁,2:不销毁)\n");
scanf("%d",&choice);
if(choice == 1)
{
for(p;h->next;) //传进来头结点 然后每次保存h->next
{ //改链域之后在删除第二个,然后第三个,
p = h->next;
h->next = p->next;
free(p); //最后需要把最后一个也释放
}
free(h);
printf("销毁成功\n");
}
if(choice == 2)
{
return 0;
}
}
head Delete(head t)
{
head p;
p = t->next; //保存要删除的节点
t->next = p->next; //更改链域绕过要删除的节点
free(p); //删除要删除的节点
printf("删除成功\n");
}
void Add(head t) //在插入之前,已经查找了插入点的位置
{
head p ; // t:find()函数的返回值,返回查找到点的前驱节点
p = (head) malloc (LEN);
printf("请输入要插入学生的信息\n");
printf("请输入学生Id\n");
scanf("%d",&p->Id);
printf("请输入学生姓名\n");
scanf("%s",p->name); //准备好要插入的信息
p->next = t->next; //将要插入的节点与后一个节点相连
t->next = p; //将前驱节点与要插入的节点相连即可
}
head Input(head h)
{
char choice;
head p;
head q;
h = (head) malloc(LEN); //整个结构要清晰 head p;
//表示p是一个四字节的,指向结构体的指针
q = h; //malloc 之后,就相当于有了空间 并且p指向它
do
{
p = (head) malloc(LEN);
printf("请输入学生Id\n");
scanf("%d",&p->Id);
printf("请输入学生姓名\n");
scanf("%s",p->name);
p->next = NULL;
h->next = p;
h = p;
printf("Contine?(Y/N)\n");
getchar();
scanf("%c",&choice);
}while(choice == 'Y'||choice == 'y' );
return(q);
}
int main(int argc,char *agrv[])
{
head h = NULL;
head t = NULL; //查找到的学生信息id所指的指针
int choice;
printf("学生信息\n");
do
{
printf("1:输入信息\n");
printf("2:增加信息\n");
printf("3:删除信息\n");
printf("4:销毁信息\n");
printf("5:显示信息\n");
printf("6:查找信息\n");
printf("0:退出程序\n");
printf("请输入:");
scanf("%d",&choice);
switch(choice)
{
case 1:
h = Input(h);
break;
case 2:
printf("请先确定要插入的位置学号(前插入)是否存在\n");
printf("注意:若不存在,默认插入到最后\n");
t = Find(h);
Add(t);
break;
case 3:
printf("请先确定要删除的学号是否存在\n");
t = Find(h);
Delete(t);
break;
case 4:Ruin(h);
break;
case 5:Print(h);
break;
case 6:Find(h);
break;
}
}while(choice != 0);
}