上篇写道了创建单链表和遍历单链表的实现
现在写几个常见的算法实现;
主函数代码:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node * pNext;
}NODE,* PNODE;
PNODE create_list(void);
void traverse_list(PNODE pHead);
int len_list(PNODE pHead);
void sort(PNODE pHead);
bool insert_list(PNODE pHead);
bool delete_list(PNODE pHead);
int main(void){
PNODE pHead = NULL;
pHead = create_list();
traverse_list(pHead);
sort(pHead);
printf("\n排序后的顺序是:\n");
traverse_list(pHead);
if(insert_list(pHead)){
printf("\n插入节点后的链表是:\n");
traverse_list(pHead);
}else{
printf("该位置不能插入节点!");
}
if(delete_list(pHead)){
printf("\n删除该节点后的链表是:\n");
traverse_list(pHead);
}else{
printf("该位置不能删除节点!");
}
return 0;
}
第一:求单链表长度:
求单链表长度的功能函数思路:
1.从首节点开始算起,到尾节点结束;用len表示个数;
2.取到首指针 即 p = pHead->pNext;
3.当p不等于NULL时,len++,p后移;
代码:
int len_list(PNODE pHead){
int len = 0 ;
PNODE p = pHead->pNext;
while(p!=NULL){
len++;
p=p->pNext;
}
return len;
}
第二:链表的节点排序(从小到大)
思路:
1.按照数组的排序算法第一个和后一个比较,如果第一个比后一个大,交换;
2.链表要指针后移:
首节点的指针是 p=pHead->pNext;
首节点后一个节点的指针是 q = p->pNext;
3.利用i,j表示第几个节点,交换节点的数值域;
代码:
void sort(PNODE pHead){
PNODE p,q;
int i,j,t;
int len = len_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->data>q->data){
t=p->data;
p->data=q->data;
q->data=t;
}
}
}
return;
}
运行结果:
第三:插入节点的算法
思路:
1.用pos和val变量存储需要插入的位置和值;
2.从i=0开始首节点,来一个首指针 p = pHead->pNext;
3.通过循环来找到插入位置pos前的那个节点说明此时i的值是pos-1,节点指针p已经到了插入位置前一个;
4.动态创建一个新的节点,并且判断是否创建成功;
5.将新创建的pNew和p与后一个q链接起来,具体看图示:按照1-->2-->3顺序看
代码:
bool insert_list(PNODE pHead){
int pos,val;
printf("\n请输入要插入的位置:\n");
scanf("%d",&pos);
printf("\n请输入要插入节点的值:\n");
scanf("%d",&val);
int i=0;
PNODE p = pHead->pNext;
while(NULL !=p && i<pos-1){
p = p->pNext;
i++;
}
if(i>pos-1 || NULL == p){
return false;
}
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(pNew == NULL){
printf("动态内存分配失败!");
exit(-1);
}
pNew->data = val;
PNODE q = p->pNext;
p->pNext = pNew;
pNew->pNext = q;
}
第四:删除节点的算法
思路:
1.用pos变量保存要删除的节点位置
2.从i=0开始首节点,来一个首指针 p = pHead->pNext;
3.通过循环来找到插入位置pos前的那个节点说明此时i的值是pos-1,节点指针p已经到了插入位置前一个;
4.看删除的图示,按照数字顺序看
代码:
bool delete_list(PNODE pHead){
int pos;
printf("\n请输入要删除的位置:\n");
scanf("%d",&pos);
int i=0;
PNODE p = pHead->pNext;
while(NULL != p && i<pos-1){
p = p->pNext;
i++;
}
if(i>pos-1 || NULL == p){
return false;
}
PNODE q = p->pNext;
PNODE j = q->pNext;
p->pNext = j;
free(q);
q = NULL;
}
插入和删除运行结果: