链表的常用算法
# include
# include
# include
//结构体
typedef struct Node
{
int data;
struct Node * Next;
}NODE, * PNODE;
//函数声明
PNODE creat_list(void);//创建链表
void is_empty(PNODE);//判断链表是否为空
void traverse_list(PNODE);//遍历链表
void length_list(PNODE);//求链表长度
void insert_list(PNODE, int, int);//插入节点
void delete_list(PNODE, int);//删除节点
void sort_list(PNODE);//节点排序
//主函数
int main(void)
{
PNODE pHead = NULL;
pHead = creat_list();
traverse_list(pHead);
length_list(pHead);
insert_list(pHead, 3, 45);
traverse_list(pHead);
delete_list(pHead, 3);
traverse_list(pHead);
sort_list(pHead);
traverse_list(pHead);
return 0;
}
//创建链表方法一
PNODE creat_list(void)
{
int val;
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if(NULL == pHead)
{
printf("分配内存失败!!!\n");
exit (-1);
}
pHead->Next = NULL;
PNODE pTail = pHead;
PNODE pNew = (PNODE)malloc(sizeof(NODE));
printf("请输入节点的值:");
scanf("%d",&val);
while(0 != val)
{
if(NULL == pNew)
{
printf("分配内存失败!!!\n");
exit (-1);
}
pNew->data = val;
pTail->Next = pNew;
pTail = pNew;
pNew = (PNODE)malloc(sizeof(NODE));
printf("请输入节点的值:");
scanf("%d",&val);
}
pTail->Next = NULL;
free(pNew);
return pHead;
}
//判断是否为空
void is_empty(PNODE pHead)
{
PNODE pNew = pHead->Next;
if(NULL == pNew)
{
printf("链表为空!!!\n");
exit (-1);
}
return;
}
//遍历链表
void traverse_list(PNODE pHead)
{
is_empty(pHead);
PNODE pNew = pHead->Next;
while(NULL != pNew)
{
printf("%d ",pNew->data);
pNew = pNew->Next;
}
printf("\n");
return ;
}
//求链表长度
void length_list(PNODE pHead)
{
is_empty(pHead);
PNODE pNew = pHead->Next;
int count = 0;
while(NULL != pNew)
{
++count;
pNew = pNew->Next;
}
printf("链表长度为%d\n",count);
return ;
}
//插入节点
//将val插入到第pos个节点之后
void insert_list(PNODE pHead, int pos, int val)
{
is_empty(pHead);
PNODE pNew = pHead->Next;
int i=0;
while(NULL != pNew && i
{
++i;
pNew = pNew->Next;
}
if(NULL == pNew)
{
printf("插入失败!!!\n");
exit (-1);
}
PNODE pInsert = (PNODE)malloc(sizeof(NODE));
pInsert->data = val;
pInsert->Next = pNew->Next;
pNew->Next = pInsert;
return ;
}
//删除节点
//删除pos节点后面的节点
void delete_list(PNODE pHead, int pos)
{
is_empty(pHead);
PNODE pNew = pHead->Next;
int i=0;
while(NULL != pNew && i
{
++i;
pNew = pNew->Next;
}
if(NULL == pNew)
{
printf("删除失败!!!\n");
exit (-1);
}
pNew->Next = pNew->Next->Next;
return ;
}
//节点排序
void sort_list(PNODE pHead)
{
is_empty(pHead);
PNODE p;
PNODE q;
int t;
for(p = pHead->Next; p != NULL; p = p->Next)
{
for(q = p->Next; q != NULL; q = q->Next)
{
if(p->data > q->data)
{
t = p->data;
p->data = q->data;
q->data = t;
}
}
}
return ;
}