C语言中,链表的创建,插入,删除,遍历,求链表长度,排序等

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>


//定义结点
typedef struct Node
{
int data;
struct Node * pNext;
}NODE,*PNODE;


//函数声明
PNODE create_list(); //创建链表
void traverse_list(PNODE pHead); //遍历链表
int is_empty(PNODE pHead); //判断链表是否为空
int length_list(PNODE pHead); //求链表的长度
int delete_node(PNODE pHead,int index);  //删除结点,0从头结点开始,返回值为删除的结点的值
void insert_node(PNODE pHead, int index, int insertVal);  //插入,当碰到index时,给当前结点的后面插入一个新的结点
void sort_list(PNODE pHead);//排序


int main()
{
PNODE pHead = NULL;
int result;
pHead = create_list();
printf("链表的值:");
traverse_list(pHead);
result = is_empty(pHead);
printf("链表是否为空:%d\n",result);
printf("链表的长度为:%d\n",length_list(pHead));
sort_list(pHead);
printf("排序后的链表为:");
traverse_list(pHead);
//printf("删除的结点的值为:%d\n",delete_node(pHead,2));
printf("正在插入结点,请稍后...\n");
insert_node(pHead,2,20);
printf("插入结点后的链表为:");
traverse_list(pHead);
return 0;
}


//创建链表
PNODE create_list()
{
int len; //结点的个数
int val; //临时存放结点的data
int i;
printf("请输入你要生成的链表的结点的个数:len=");
scanf_s("%d",&len,2);


//创建头结点
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if (NULL == pHead)
{
printf("创建头结点失败!\n");
exit(-1);
}


//创建一个临时结点(这个临时结点始终指向尾结点)
PNODE pTail = pHead;
pTail->pNext = NULL;


for (i = 0; i < len; i++)
{
printf("请输入第%d个结点的值:val=",i+1);
scanf_s("%d",&val,2);
/*
ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内在泄露。
所以vc++2005/2008中提供了scanf_s(),在调用时,必须提供一个数字以表明最多读取多少位字符。
*/


//创建新结点
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("创建新结点失败!\n");
exit(-1);
}


pNew->data = val; //指定新结点的数据域


//定义一个临时指针移动指向每个新结点
pTail->pNext = pNew;


pNew->pNext = NULL; //指定新结点的指针域


pTail = pNew;
}
printf("链表创建成功!\n");
return pHead;
}


//遍历结点
void traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext;
while (p != NULL)
{
printf("%d\t",p->data);
p = p->pNext;
}
printf("\n");
}


//判断链表是否为空
int is_empty(PNODE pHead)
{
if (pHead->pNext == NULL)
{
return 0; //链表为空
}
return 1;
}


//求链表的长度
int length_list(PNODE pHead)
{
int length=0;
PNODE p = pHead->pNext;
while (p != NULL)
{
length++;
p = p->pNext;
}
return length;
}


//排序
void sort_list(PNODE pHead)
{
int i, j, temp;
int len = length_list(pHead);
PNODE p, q;
//插入排序
for (i = 0,p = pHead->pNext; i < len-1;i++,p = p->pNext)
{
for (j = i + 1,q = p->pNext; j < len;j++,q = q->pNext)
{
if (p->data > q->data) //相当于a[i]>a[j]
{
temp = p->data; //temp = a[i];
p->data = q->data; //a[i] = a[j];
q->data = temp; // a[j] = temp;
}
}
}
return;
}


//删除结点
int delete_node(PNODE pHead, int index)
{
PNODE p = pHead->pNext,temp=NULL;
int i = 0;
int length = length_list(pHead);
if (index >= length - 1)
{
printf("删除失败!\n");
return -1;
}


while (p != NULL)
{
i++;
//printf("i=%d\t",i);
if (index == i)
{
//printf("正在准备删除结点\n");
//删除结点
temp = p->pNext;
p = p->pNext->pNext;
return temp->data;
}
p = p->pNext;
}
return NULL;
}


//插入结点
void insert_node(PNODE pHead, int index, int insertVal)
{
PNODE p = pHead->pNext;
PNODE newNode = (PNODE *)malloc(sizeof(NODE));
int i = 0;


int length = length_list(pHead);
if (index >= length - 1)
{
printf("插入结点失败!\n");
return -1;
}


if (newNode == NULL)
{
printf("创建新结点失败!\n");
return;
}


newNode->data = insertVal;
newNode->pNext = NULL;
//printf("构建新结点成功!\n");
while (p != NULL)
{
i++;
if (index == i)
{
//在p结点的后面插入新的结点
newNode->pNext = p->pNext;
p->pNext = newNode;
}
p = p->pNext;
}
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值