c语言单链表的创建、插入、删除

由于之前的下位机开发要求比较低,很少使用链表,后来换了份工作,跟另外一个同事共同开发一个主控程序,链表成为了最基本的数据结构,所以花了一段时间对链表进行了比较认真的学习,以下内容为个人对链表的一些理解。

1:链表的结构

链标的单位为节点,节点包含数据及指向下一个节点的地址。

c语言单链表的创建、插入、删除c语言单链表的创建、插入、删除

2:链表的创建

将各个节点按上图的结构串联在一起

3:链表的插入

c语言单链表的创建、插入、删除

4、删除一个节点

c语言单链表的创建、插入、删除c语言单链表的创建、插入、删除

5:以下部分为代码

可直接运行

#include "stdio.h"
#define LEN sizeof(Node)
#define null NULL
typedef struct student
{
int num;
float score;
struct student * next;
}Node,* pNode;


//创建一个链表 长度为num
pNode createList(int num);
//打印链表
void printList(pNode p);
//清除链表
void clearList(pNode p);
//删除链表的节点
pNode deleteListNode(pNode head,int num);


//在链表中插入节点
pNode insertListNode(pNode head,int num);


void main(void)
{
pNode head;
int num = 0;
head = createList(5);
puts("打印链表如下");
printList(head);
puts("请输如删除的项目");
scanf_s("%d",&num);
head = deleteListNode(head,num);
puts("删除后的链表\n");
printList(head);
puts("请输入要插入的节点序号");
scanf_s("%d", &num);
head = insertListNode(head,num);
printList(head);
clearList(head);
}


pNode createList(int num)
{
pNode head;
pNode p1, p2;
int i = 0;
head = NULL;


p2 = (pNode)malloc(LEN);
for (i = 0; i < num; i++)
{
p1 = (pNode)malloc(LEN);
puts("请输入学生编号");
p1->next = NULL;
scanf_s("%d %f",&p1->num,&p1->score);
if (i == 0)
{
head = p1;
}
else
{
p2->next = p1;
}
p2 = p1;
}
p2->next = NULL;
return head;
}


void printList(pNode p)
{
while (p != NULL)
{
printf("学生编号%d 分数%f\n",p->num,p->score);
p = p->next;
}
}


void clearList(pNode p)
{
pNode q;
while (p != null)
{
q = p->next;
free(p);
p = q;
}
}


pNode deleteListNode(pNode head, int num)
{
pNode p1, p2;
int i = 0;
p1 = head;
p2 = (pNode)malloc(LEN);
for (i = 0; i < (num-1); i++)
{
p2 = p1;
p1 = p1->next;
}
if (p1 == head)
{
head = p1->next;
}
else
{
p2->next = p1->next;
free(p1);
}
p1 = null;
return head;
}


pNode insertListNode(pNode head, int num)
{
pNode p1;
pNode p2;
pNode p3;
int i = 0;
p1 = head;
p3 = (pNode)malloc(LEN);
printf("请输入要插入的学号 及 分数\n");
scanf_s("%d %f",&p3->num,&p3->score);
for (i = 0; i < (num - 1); i++)  //找到节点位置
{
if (p1 != null)
{
p1 = p1->next;
}
}
p2 = p1->next;
p1->next = p3;
p3->next = p2;
return head;
}