链表的相关函数操作
- 头文件
- 结构体的定义
- 函数声明
- 主函数
- 函数
- 链表与数组的优缺点
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
# include <stdbool.h>
typedef struct Node
{
int date ; //作为链表的数据域
struct Node *pNext ; //作为链表的指针域,用于指向结构体类行的下一个节点
} NODE ,*PNODE ; // NODE 等价于 struat node PNODE 等价于 struct Node *
//对将要用到的函数进行声明
PNODE create_list (void); //建立链表
void traverse_list (PNODE pHead); //遍历链表
bool is_empty (PNODE pHead); //判断链表是否为空
int length_list (PNODE pHead ); //求出链表的长度,将长度作为int 型数值返回
bool insert_list (PNODE ,int ,int ); //插入节点
bool delete_list (PNODE ,int ,int *); //删除第int 个节点,并记录删除节点的数据
void soert_list (PNODE); //节点排序
int main (void )
{
PNODE pHead =NULL; //等价于 struct Node *pHead=NULL
int val; //用于记录删除节点的数据
pHead =create_list (pHead); //创建一个非循环的单链表,并将该链表的首给pHead
traverse_list (pHead);
int len =length_list (pHead);
printf ("链表的长度是 %d \n",len );
insert_list (pHead,4,33);
traverse_list (pHead);
soert_list (pHead);
traverse_list (pHead);
if (delete_list (pHead,4,&val))
{
printf ("删除成功,您删除的元素是: %d\n",val);
}
else
{
printf ("删除失败!您删除的元素不存在。\n");
}
traverse_list (pHead);
if (is_empty (pHead))
printf ("链表为空! \n");
else
printf ("链表不为空! \n");
return 0;
}
创建链表函数
PNODE create_list (void)
{
int len ; //用于存放有效节点的个数
int i;
int val; //用于临时存放用户输入的节点的值
PNODE pHead =(PNODE )malloc (sizeof(NODE)); //分配了一个不存放有效数据的头节点
if (NULL==pHead)
{
printf (" 分配失败,程序终止 !\n");
exit (-1);
}
PNODE pTail=pHead;
pTail->pNext =NULL;
printf ("请输入您需要生成的链表节点的个数 :len= ");
scanf ("%d",&len);
for (i=0;i<len;++i)
{
printf ("请输入第%d 个节点的值:",i+1);
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",p->date);
p=p->pNext;
}
printf ("\n");
return 0;
}
判断链表是否为空
bool is_empty (PNODE pHead)
{
if (pHead->pNext==NULL)
return true;
else
return false;
}
bool 是布尔型变量 头文件是 #include <stdbool.h>
BOOL是布尔型变量,也就是逻辑型变量的定义符,类似于float、double等,只不过float定义浮点型,double定义双精度浮点型。在objective-c中提供了相似的类型BOOL,它具有YES值和NO值。布尔型变量的值只有 真(true)和假(false),可用于逻辑表达式,也就是“或”“与”“非”之类的逻辑运算和大于小于之类的关系运算,逻辑表达式运算结果为真或为假。 (百科)
例如
bool b;
b=(1>2);
此时b=true。
求链表的长度
int length_list (PNODE pHead)
{
PNODE p=pHead->pNext;
int len =0;
while (NULL!=p)
{
++len ;
p=p->pNext;
}
return len;
}
使p指向节点的指针域,当所指向的指针域不为空时len +1,不包括首节点。
++i 和 i++的区别:
++ i 是先加后赋值;i ++ 是先赋值后加;++i和i++都是分两步完成的
链表的排序
void soert_list (PNODE pHead)
{
int i,j,t;
int len =length_list (pHead);
PNODE p,q;
for (i=0,p=pHead->pNext;i<len-1;i++,p->pNext)
{
for (j=i+1,q=p->pNext;j<len-1;++j,q=q->pNext)
{
if (p->date>q->date) //类似于数组中的 a[i]>a[j]
{
t=p->date; //类似于数组中的 t=a[i]
p->date=q->date; //类似于数组中的a[i]=a[j]
q->date=t; //类似于数组中的 a[j]=t;
}
}
}
return ;
}
泛型的定义:
利用某种技术达到的效果(使不同存储方式执行的操作相同)
新链表的插入
//在pHead所向链表的第pos 个节点的前面插入一个新的节点,该节点的值是val,并且pos 的值是从1开始
bool insert_list (PNODE pHead,int pos,int val)
{
int i=0;
PNODE p=pHead;
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 (NULL==pNew)
{
printf ("动态分配内存失败! \n");
exit (-1);
}
pNew->date=val;
PNODE q=p->pNext;
p->pNext=pNew;
pNew->pNext=q;
return true ;
}
链表的删除
bool delete_list (PNODE pHead,int pos,int *pVal)
{
int i=0;
PNODE p=pHead;
while (NULL!=p->pNext&&i<pos-1)
{
p=p->pNext;
++i;
}
if (i>pos-1||NULL==p->pNext)
return false;
PNODE q=p->pNext;
*pVal=q->date ;
// 删除p 节点后面的节点
p->pNext=p->pNext->pNext;
free (q);
q=NULL;
return true;
}
6
数据的存储结构分为线性和非线性
线性分为连续存储( 数组)和离散存储 (链表) 应用为栈和队列
数组 :
存储速度快,但插入元素很慢空间通常有限制
链表 :
空间无限制,插入删除元素很快 但是存取的速度慢
非线性的为
树
图