版权声明:转载请注明 https://blog.csdn.net/qq_34720818/article/details/87926464
C语言之单链表的常见操作代码实现
链表就是一种能够动态进行存储分配的结构,可以根据需要开辟内存单元,是一种常见的重要的数据结构。
一、构造结构体person数据类型
struct person
{
int id;
char name[12];
float height;
float weight;
struct person *next;
};
二、建立动态链表
//建立动态链表
struct person *ceate()
{
struct person *head=NULL,*tail,*p;
float height,weight;
int id;
char name[12];
printf("ID\t Name\t Height\t weight\n");
scanf("%d%s%f%f",&id,name,&height,&weight);
while(id!=0)
{
p=(struct person*)malloc(LEN);
p->id=id;
strcpy(p->name,name);
p->height=height;
p->weight=weight;
p->next=NULL;
if(head==NULL)
{
head=p;
}
else
{
tail->next=p;
}
tail=p;
scanf("%d%s%f%f",&id,name,&height,&weight);
}
return head;
}
三、遍历链表
void outputNodes(struct person *head)
{
struct person *p;
if(head==NULL)
{
printf("没有节点数据");
return;
}
printf("ID\t Name\t Height\t weight\n");
for(p=head;p!=NULL;p=p->next)
{
printf("%d %s %f %f\n",p->id,p->name,p->height,p->weight);
}
printf("\n");
}
四、删除链表结点
//删除指定id的链表结点
struct person *deleteNode(struct person *head,int id)
{
struct person *p1,*p2;
//链表为空
if(head==NULL)
{
printf("链表为空\n");
return NULL;
}
//要删除的节点为头结点
if(head!=NULL&&head->id==id)
{
p2=head;
head=head->next;
//free(p2);
}
//删除的节点不是头结点
p1=head;
p2=head->next;
while(p2!=NULL)
{
if(p2->id==id)
{
p1->next=p2->next;
//free(p2);
}
else
{
p1=p2;//p1向p2后移动
}
p2=p1->next;//p2向p1的后一个节点移动
}
return head;
}
五、测试以上方法
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN 20
void main()
{
//printf("测试\n");
struct person *ceate();
void outputNodes(struct person *head);
struct person *deleteNode(struct person *head,int id);
printf("创建链表\n");
struct person *head=ceate();
printf("打印链表\n");
outputNodes(head);
int id;
printf("请输入删除节点索引\n");
scanf("%d",&id);
printf("删除链表第%d个节点\n",id);
head=deleteNode(head,id);
printf("打印链表\n");
outputNodes(head);
}