单向链表
#include <stdio.h>
#include <stdlib.h>
struct list //结构体做链表
{
int date; //链表数据
struct list *next; //下一链表的地址,类型为struct list指针,名字为next
};
struct list* creat(); //创建链表函数
void input(struct list *head); //输入数据函数
void output(struct list *head); //输出数据函数
void insert(struct list *head); //插入数据函数
void myexit(struct list *head); //退出程序函数
void main()
{
int i,num;
struct list *head=NULL; //建立链表头,使之为空
for(i=0;;i++)
{
printf("1.创建新链表\n");
printf("2.输入数据\n");
printf("3.输出当前链表\n");
printf("4.插入数据\n");
printf("0.退出");
putchar('\n');
scanf("%d",&num);
switch (num) //switch函数实现功能选择
{
case 1:
head=creat(); //后面的就是以此开辟的head来运行
break;
case 2:
input(head);
break;
case 3:
output(head);
break;
case 4:
insert(head);
break;
case 0:
myexit(head);
default :
printf("无效\n");
}
}
}
struct list* creat() //注:返回值类型为你定义的结构体
{
char anser;
struct list *head;
printf("是否创建新链表y/n\n");
scanf(" %c",&anser);
if(anser=='y'|| anser=='Y')
{
head=malloc(sizeof(struct list)); //开辟一个大小为list的空间
return head; //返回该地址给主函数的链表头
}
else
exit(0);
}
void input(struct list *head)
{
int i;
struct list *p;
p=head; //使p指向链表头
printf("输入0表示结束\n"); //控制输入结束
for(i=0;;i++)
{
printf("输入数据\n");
p->next =malloc(sizeof(struct list)); //开辟p的下一个结构体并将地址传给next
p=p->next ; //使p指向开辟的空间
scanf(" %d",&p->date ); //输入值并判断是否为0
if(p->date ==0)
{
p->next =NULL; //结束就使下一个链表为空
break;
}
}
}
void output(struct list *head)
{
int i;
struct list *p;
p=head->next ;
for(i=0;;i++)
{
printf("%d ",p->date );
p=p->next ;
if(p->next ==NULL) //下个链表为空时就结束
break;
}
printf("\n\n\n");
}
void insert(struct list *head)
{
int add,i;
char anser;
struct list *p=NULL,*pr=NULL;
printf("是否插入\n");
scanf(" %c",&anser);
if(anser=='Y' || anser=='y')
{
printf("在哪个数后插入\n");
scanf("%d",&add);
p=head; //p为链表头地址
for(i=0;;i++)
{
p=p->next ; //p指向下一个链表(head内没有数据)
if(p->date == add) //找到数据
{
pr=p->next ; //记住下一个链表的位置
p->next =malloc(sizeof(struct list)); //开辟下一个链表
p=p->next ; //使当前的next指向开辟的空间
printf("输入要插入的数据\n");
scanf("%d",&p->date );
p->next =pr; //使开辟的链表的next与开始记住的链表连接
break;
}
else if(p->next ==NULL)
{
printf("没有找到\n");
break;
}
}
output(head);
}
else
exit(0);
}
void myexit(struct list *head) /*注:开辟的空间都要释放,会占用系统内存,虽然程序该程序结束时会自动释放,
但是会影响以后编写软件时的习惯,造成不良后果,所以开辟的空间一定要释放*/
{
struct list *p=head,*pr;
while(p!=NULL)
{
pr=p;
p=p->next ;
free(pr);
}
exit(0);
}
当时没有做界面优化,所以有些难看,删除和插入类似,就没有写。