手机
当前位置:查字典教程网 >编程开发 >C语言 >C数据结构之单链表详细示例分析
C数据结构之单链表详细示例分析
摘要:复制代码代码如下:#include#includetypedefstructtype{intnum;structtype*next;}TYP...

复制代码 代码如下:

#include <stdio.h>

#include <stdlib.h>

typedef struct type

{

int num;

struct type *next;

}TYPE;

//=============================================================

// 语法格式: TYPE *init_link_head(int n)

// 实现功能: 从头到尾,正序创建一个具有n个节点的链表,并对其值进行初始化

// 参数: n: 链表的长度,即节点的个数

// 返回值: 所创建链表的首地址

//=============================================================

TYPE *init_link_head(int n)

{

int i;

TYPE *phead = NULL, *pf = NULL, *pi = NULL;

for(i=0; i<n; i++)

{

pi = (TYPE *)malloc(sizeof(TYPE));

printf("please inout num:n");

scanf("%d",&pi->num);

if(i == 0)

pf = phead = pi;

else

{

pf->next = pi;

pf = pi;

}

pi->next = NULL;

}

return phead;

}

//=============================================================

// 语法格式: TYPE *init_link_end(int n )

// 实现功能: 从尾到头,倒序创建一个具有n个节点的链表,并对其值进行初始化

// 参数: n: 链表的长度,即节点的个数

// 返回值: 所创建链表的首地址

//=============================================================

TYPE *init_link_end(int n )

{

TYPE *phead = NULL, *pi = NULL;

int i ;

for(i=0; i<n; i++)

{

pi = (TYPE *)malloc(sizeof(TYPE));

printf("please inout num:n");

scanf("%d",&pi->num);

if(i == 0)

pi->next = NULL;

else

pi->next = phead;

phead = pi;

}

return phead;

}

//=============================================================

// 语法格式: insert_link(TYPE * phead,TYPE * pi)

// 实现功能: 将新申请的节点加入到指定链表中

// 参数: *phead:待插入链表

// * pi:带插入节点

// 返回值: 插入指定节点后的新链表首址

//=============================================================

TYPE * insert_link(TYPE *phead, TYPE *pi)

{

TYPE *pb, *pf;

pb = phead;

if(phead == NULL)

{

phead = pi;

phead->next = NULL;

}

else

{

while((pi->num > pb->num) && (pb->next != NULL))

{

pf = pb;

pb = pb->next;

}

if(pi->num <= pb->num)

{

if(pb == phead)

{

pi->next = phead;

phead = pi;

}

else

{

pf->next = pi;

pi->next = pb;

}

}

else

{

pi->next = NULL;

pb->next = pi;

}

}

return phead;

}

//=============================================================

// 语法格式: delete_link(TYPE * phead,int num)

// 实现功能: 删除给定序号所指向的节点

// 参数: *phead:待删除链表

// num: 所需删除的节点

// 返回值: 删除指定节点后的新链表首址

//=============================================================

TYPE * delete_link(TYPE *phead, int num)

{

TYPE *pf;

TYPE *pb;

if(phead == NULL)

{

printf("nempty linkn");

return NULL;

}

pb = phead;

while((pb->num != num) && pb->next != NULL)

{

pf = pb;

pb = pb->next ;

}

if(pb->num == num)

{

if(pb == phead)

phead = phead->next;

else

pf->next = pb->next;

free(pb);

printf("the node is deletedn");

}

else

printf("the node not foundn");

return phead;

}

//=============================================================

// 语法格式: print_link(TYPE * phead)

// 实现功能: 打印指定链表中的全部节点数据

// 参数: *phead:待打印的链表首址

// 返回值: 无

//=============================================================

void print_link(TYPE *phead)

{

TYPE *temp = phead;

while( temp != NULL)

{

printf(" %d ",temp->num);

temp = temp->next;

}

}

//=============================================================

// 语法格式: search_num(TYPE * phead,int num)

// 实现功能: 在指定的链表中,按姓名查找指定元素

// 参数: phead:待查找的链首址,num需要查找的字符串

// 返回值: 无

//=============================================================

void search_num(TYPE *phead, int num)

{

TYPE *temp = phead;

while(temp != NULL)

{

if(temp->num == num)

printf(" %d ",num);

temp = temp->next;

}

if(temp == NULL)

printf("node not been foundn");

}

//=============================================================

// 语法格式: order_link(TYPE * phead)

// 实现功能: 采用冒泡法,对指定链表按序号进行排序(交换数据域)

// 参数: phead:待排序的链首址

// 返回值: 排好序的链表phead指针

//=============================================================

TYPE *order_link(TYPE *phead)

{

TYPE *pb,*pf,temp;

pb = pf =phead;

if(phead == NULL)

return NULL;

while(pb->next != NULL)

{

pf = pb->next;

while(pf != NULL)

{

if(pb->num > pf->num)

{

temp = *pb;

*pb = *pf;

*pf = temp;

temp.next = pb->next;

pb->next = pf->next;

pf->next = temp.next;

}

pf = pf->next;

}

pb = pb->next;

}

return phead;

}

//=============================================================

// 语法格式: reverse_link(TYPE * phead)

// 实现功能: 对给定链表按序号进行倒序排序

// 参数: phead:待排序的链首址

// 返回值: 排好序的链表phead指针

//=============================================================

TYPE *reverse_link(TYPE *phead)

{

TYPE *pb, *pf, *temp;

pb = phead;

pf = pb->next;

while(pf != NULL)

{

temp = pf->next;

pf->next = pb;

pb = pf;

pf = temp;

}

phead->next = NULL;

phead = pb;

return phead;

}

//=============================================================

// 语法格式: free_all(TYPE * phead)

// 实现功能: 释放链表中所有的节点

// 参数: phead:待释放的链表首址

// 返回值: 无

//=============================================================

void free_all(TYPE *phead)

{

TYPE *p;

while(phead!=NULL)

{

p=phead->next;

free(phead);

phead=p;

}

}

//=============================================================

// 语法格式: merge(TYPE *p1,TYPE *p2)

// 实现功能: 对两个链表进行升序合并

// 参数: p1,p2两个代合并的链表

// 返回值: 合并后的链表

//=============================================================

TYPE *merge_link(TYPE *p1, TYPE *p2)

{

TYPE *p, *phead;

if(p1 == NULL)

return p2;

if(p2 == NULL)

return p1;

if(p1->num < p2->num)

{

phead = p = p1;

p1 = p1->next;

}

else

{

phead = p = p2;

p2 = p2->next;

}

while(p1 != NULL && p2 != NULL)

{

if(p1->num < p2->num)

{

p->next = p1;

p = p1;

p1 = p1->next;

}

else

{

p->next = p2;

p = p2;

p2 = p2->next;

}

}

if(p1 != NULL)

p->next = p1;

else

p->next = p2;

return phead;

}

//=============================================================

// 实现方法: 运用递归

// 语法格式: merge(TYPE *p1,TYPE *p2)

// 实现功能: 对两个链表进行升序合并

// 参数: p1,p2两个代合并的链表

// 返回值: 合并后的链表

//=============================================================

TYPE * merge_link_self(TYPE *p1, TYPE *p2)

{

TYPE *phead = NULL;

if(p1 == NULL)

return p2;

if (p2 == NULL)

return p1;

if(p1->num < p2->num)

{

phead = p1;

phead->next =merge_link(p1->next, p2);

}

else

{

phead = p2;

phead->next = merge_link(p1, p2->next);

}

return phead;

}

int main(void)

{

return 0;

}

【C数据结构之单链表详细示例分析】相关文章:

C语言printf详细解析

STL list链表的用法详细解析

C数据结构之双链表详细示例分析

C++嵌套类与局部类详细解析

C++卸载程序功能示例

C与C++中结构体的区别

C++多继承同名隐藏实例详细介绍

数组指针、指针数组以及二位数组的深入解析

C语言的指针类型详细解析

浅析C++中单链表的增、删、改、减

精品推荐
分类导航