接着上次链表的创建和遍历,这次写了链表的插入、删除、判断是否为空、排序、求链表的长度。数据结构的小算法,自己实现的。可以做为参考。
理论知识:
有时间补上。
#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
#include <stdlib.h>
typedef struct Node
{
int date; //数据域
struct Node *pNext;//指针域
}NODE,*PNODE;
//函数申明
PNODE Create_list(void);
void traverse_list(PNODE pHead);//遍历链表
bool is_empty(PNODE pHead);//判断链表是否为空
int length_list(PNODE pHead);//求链表的长度
bool insert_list(PNODE pHead,int site,int val);//插入节点
int delete_list(PNODE pHead,int site);//删除节点
void sort_list(PNODE);//排序
int main()
{
PNODE pHead = NULL;
pHead = Create_list();
is_empty(pHead);
traverse_list(pHead); //遍历链表
printf("链表的长度为 = %d\n",length_list(pHead));
printf("排序\n");
sort_list(pHead);
traverse_list(pHead); //遍历链表
printf("插入\n");
insert_list(pHead,3,10);
traverse_list(pHead); //遍历链表
printf("删除\n");
delete_list(pHead,2);//删除节点
traverse_list(pHead); //遍历链表
return 0;
}
void sort_list(PNODE pHead)
{
PNODE p,q;
int i,j,t;
int len = length_list(pHead);
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 -> date > q -> date)
{
t = p -> date;
p -> date = q -> date;
q -> date = t;
}
}
}
return;
}
int delete_list(PNODE pHead,int site)//删除节点
{
int val = 0;
if(site < 0 || site > length_list(pHead))
{
printf("序号出错!\n");
exit(-1);
}
else
{
PNODE p,q;
p = pHead;
for(int i = 0; i < site - 1; ++i)
{
p = p -> pNext;
}
q = p -> pNext;
p -> pNext = q -> pNext;
printf("删除的数据为:%d\n",val = q -> date);
free(q);
}
return val;
}
bool insert_list(PNODE pHead,int site,int val)//插入节点
{
if(site < 0 || site > length_list(pHead))
{
printf("输入序号有误!\n");
exit(-1);
}
else
{
PNODE p = pHead;
PNODE pNew = (PNODE)malloc(sizeof(NODE));
for(int i = 0; i < site; ++i)
{
p = p -> pNext;
}
pNew -> date = val;
pNew -> pNext = p -> pNext;
p -> pNext = pNew;
}
return true;
}
int length_list(PNODE pHead)//求链表的长度
{
int i = 0;
while(NULL != pHead -> pNext)
{
++i;
pHead = pHead -> pNext;
}
return i;
}
bool is_empty(PNODE pHead)//判断链表是否为空
{
if(NULL == pHead -> pNext)
{
printf("链表为空!\n");
return true;
}
else
{
printf("链表不为空!\n");
return false;
}
}
PNODE Create_list(void)
{
int len = 0;
printf("请输入你需要创建的节点数:");
scanf("%d",&len);
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if(pHead == NULL)
{
printf("分配失败!\n");
exit(-1);
}
PNODE pTail = pHead;
if(0 == len)
{
pHead -> pNext = NULL;
}
printf("开始分配数据\n");
for(int i = 0; i < len; ++i)
{
int val = 0;
scanf("%d",&val);
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(NULL == pNew)
{
printf("分配失败!\n");
exit(-1);
}
pNew -> date = val;
pTail -> pNext = pNew;
pNew -> pNext = NULL;
pTail = pNew;
}
return pHead;
}
void traverse_list(PNODE pHead)
{
PNODE p = pHead -> pNext;
while(NULL != p)
{
printf("%d\t",p -> date);
p = p -> pNext;
}
printf("\n");
return;
}