0
点赞
收藏
分享

微信扫一扫

有头结点的单链表,实现增删改查,头尾中间插,友好版

Mhhao 2022-03-25 阅读 32
c语言

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(在中间或者尾插也是这样); ②有返回值 
举报

相关推荐

0 条评论