1.主函数以及头插输入,特定位置插入信息,输出
2.插入(头插,特定位置插,尾插),删除查找(采用找朋友插队诙谐的代码解释,但请不要随意插队哦)
1。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node
{
char name[20];
int num;
struct node* next;
}Node,*Link;
//定义结点
Link Init()
{
Link head;
head=(Node*)malloc(sizeof(Node));
head->next=NULL;
return head;
}
//有头结点的单链表,初始化,创造旗帜(因为指针域为空,暂时不是人)
void Creatbe(Link head)
{
Link r;
char name[20];
int num;
printf("请输入头插实现学生的姓名及学号:\n");
while(1)
{
scanf("%s",name);
scanf("%d",&num);
if(num==0)
break;
r=(Node*)malloc(sizeof(Node));
strcpy(r->name,name);
r->num=num;
r->next=head->next;
head->next=r;
}
//return head;
}
void Output(Link head)
{
Node* s;
//s=(Node*)malloc(sizeof(Node));
s=head->next;
printf("学生信息如下:\n");
while(s)
{
printf("姓名:%s\t",s->name);
printf("学号:%d\n\n",s->num);
s=s->next;
}
}
//头插或尾插都可创建一个链表,这里采用的是头插
void Creatte(Link head,int i)
{
Node* p=head,*s; //p找到第一个人的位置,有找到后面人的条件
int m=0;
while(m<i-1&&p)//遍历找到要插入的结点位置,并且要防止溢出
{
p=p->next;
m++;
}
if(p)
{
printf("请输入在第%d位置要插入的学生姓名和学号:\n",i);
s=(Node*)malloc(sizeof(Node));
scanf("%s",s->name);
scanf("%d",&s->num);
s->next=p->next;
p->next=s;
}
}
//特定位置有中间,头,尾
//删除,查询调参都一样
int main()
{
Node* be,*te;
be=Init();
Creatbe(be);
Output(be);
//头插输入
int j;
printf("你想在第几个位置插入:");
scanf("%d",&j);
j=2;//想在第几个位置插入
te=Init(be);
Creatte(be,j);
Output(be);
//特定位置插入
int pos;
scanf("%d",&pos);
Delete(be,pos);
//删
Node* p;
char posname[20];
scanf("%s",posname);
p=Search(be,posname);
//查
int Lenth;
Length=ListLength(be);
//长度
return 0;
}
2.插入(头插,特定位置插,尾插),删除查找
//找朋友在特定地方插队
void Creatte(Link head,int i)
{
int j=0;
Node* p=head,*s;//p是朋友在的队伍,s是你
if(j<i-1&&p)
{
p=p->next;
j++;//一个接一个人找
}
printf("请输入在第%d位置上插入的学生姓名以及学号:\n",i);
while(p)//朋友在队伍内
{
s=(Node*)malloc(sizeof(Node));//准备给你腾地
scanf("%s",s->name);
scanf("%d",&s->num);
s->next=p->next;//礼貌的告诉朋友后面的人
p->next=s;//这个位置是你的了
}
}
//找朋友在第一个插队
void Creattou(Link head)
{
Node* p;
printf("请输入要插入的学生姓名和学号:\n");
scanf("%s",p->name);
scanf("%d",&p->num);
p->next=head->next;//除了不再申请空间,和头插法方法一致
head->next=p;
}
//尾插,很不幸,朋友在最后面,你 找到队就行了,排最后吧,可别忘了给最后扩容啊
void Creathou(Link head)
{
Node *p=head,*s;
printf("请输入排队同学的姓名和学号:\n");
s=(Node*)malloc(sizeof(Node));
scanf("%s",s->name);
scanf("%d",&s->num);
p->next=s;
s->next=NULL;//只要给自己扩容就行了,别忘了收尾,你后边没人了哈
}
//删除(完了,被发现了,队伍不要你了)
void delete(Link head,int pos)
{
Node *p=head,*s;
int j=0;
if(j<pos-1&&p)
{
p=p->next;
j++;
}
if(p==NULL||p->next==NULL)
printf("这位置不对啊\n");
else
{
q=p->next;
p->next=q->next;//找到你,直接让你朋友连你后边人(不拿我当回事)
free(q);//你免费了>_<
}
}
//在你们班找你
Node *Search(Link head,char name[20])
{
Node *p=head->next;//从第一个人按顺序找下去
while(p)
{
if(strcmp(p->name,name)!=0)//苦苦的按名找啊
{
p=p->next;
}
}
if(p=NULL)
{
printf("这个班没有!\n");
}
return p;
}
//统计你们班有多少人
int ListLength(List head)
{
int count=0;
Node *p=head->next;
while(p)
{
count++;
p=p->next;
}
return count;
}
//只在尾插时 扩充 空间
//只有查人和计数 才 ①p=head->next(在中间或者尾插也是这样); ②有返回值