C语言链表的创建,增删,排序

索性写写链表程序,直接上代码:

#include<stdio.h>
#include<stdlib.h>
struct Node
{
    int data;
    struct Node* Next;
};
//生成链表的节点
void CreatNewNode(struct Node* Head,int lenth)
{
    int i=0;
    for(i=0;i<lenth;i++)
    {
	struct Node* NewNode=(struct Node*)malloc(sizeof(struct Node));
	if(NewNode!=NULL)
	{
	    Head->Next=NewNode;
	    Head=NewNode;
	}
	else
	{
	    exit(-1);
	}
    }
}
//初始化链表
void InitList(struct Node* Head)
{
    int count=0;
    while(Head->Next!=NULL)
    {
	count++;
	printf("请输入第%d个节点的数据:",count);
	scanf("%d",&Head->Next->data);
	Head=Head->Next;
    }
}

//统计链表当中节点的个数
int Statistic(struct Node* Head)
{
    int lenth=0;
    while(Head->Next!=NULL)
    {
	lenth++;
	Head=Head->Next;
    }
    return lenth;
}

//插入节点
void InsertNode(struct Node* Head)
{
    int lenth=Statistic(Head);
    printf("目前总共有%d个节点\n",lenth);
    int n;
    printf("输入你想在第几个几点插入新节点:");
    scanf("%d",&n);
    while(n--)
    {
	Head=Head->Next;
    }
    struct Node* NewNode=(struct Node*)malloc(sizeof(struct Node));
    int num;
    printf("请输入你想插入的数据:");
    scanf("%d",&num);
    NewNode->data=num;
    NewNode->Next=Head->Next;
    Head->Next=NewNode;
}

//删除节点
void DeleteNode(struct Node* Head)
{
    int n;
    printf("输入你想删除第几个节点:");
    scanf("%d",&n);
    while(--n)
    {
	Head=Head->Next;
    }
    Head->Next=Head->Next->Next;
}
//冒泡排序链表数据
void BubbleSort(struct Node* Head)
{   
    int i,j;
    //这里是为了统计链表的节点个数,因为增,删节点会改变节点个数
    int lenth=Statistic(Head);
    struct Node* pHead=Head;
    for(i=0;i<lenth-1;i++)
    {
	for(j=0;j<lenth-i-1;j++)
	{
	    if(pHead->Next->data>pHead->Next->Next->data)
	    {
		int temp;
		temp=pHead->Next->data;
		pHead->Next->data=pHead->Next->Next->data;
		pHead->Next->Next->data=temp;
	    }
	    //比完一次就往后移动一次
	    pHead=pHead->Next;
	}
	//一轮结束后,pHead要重新指向头结点,不然会导致越界访问,程序崩掉
	pHead=Head;
    }
}
//打印链表 
void PrintList(struct Node* Head)
{
    while(Head->Next!=NULL)
    {
	printf("%-4d",Head->Next->data);
	Head=Head->Next;
    }
    printf("\n");
}
int main()
{
    //创建链表的头结点
    struct Node* Head=(struct Node*)malloc(sizeof(struct Node));
    if(Head==NULL)
    {
	//如果创建失败直接退出程序
	exit(-1);
    }
    else
    {
	//创建成功就把头结点的指针域置空,养成好习惯,只要有指针就先置空
	Head->Next=NULL;
    }
    int lenth;
    printf("请输入你想生成的节点的个数:");
    scanf("%d",&lenth);
    CreatNewNode(Head,lenth);
    InitList(Head);
    PrintList(Head);
    InsertNode(Head);
    PrintList(Head);
    DeleteNode(Head);
    PrintList(Head);
    BubbleSort(Head);
    PrintList(Head);
    //释放头结点指向的那块空间
    free(Head);
    return 0;
}

在这里插入图片描述
OK,以上就是我按照自己的写法写的一个链表,基本的功能都有包括,如果想做成学生管理系统你能不看我的源码把这些全部写出来的话,做什么都不是问题,这个只是基础,要先把基础打扎实才能玩更牛逼的项目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值