链表是学习数据结构的基础,何为数据结构,简单来说就是研究数据的存储问题,算法是对数据的操作问题,存储主要是个人的存储和个人与个人的关系的存储,研究如何将我们现实生活中各种事物及其关系的存储。
链表的优缺点(相比于同是线性结构的数组): 1.空间没有限制 2.插入元素速度快 。但是存取速度不如数组!
重点–排序 插入 删除 节点的算法
/*
2018年11月19日18:06:26 链表程序
*/
# 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 ) ; //链表的遍历
bool is_empty (PNODE phead) ;
int length_list (PNODE phead) ;
void insert_list (PNODE phead,int pos,int val) ; //在第pos个节点后面插入节点 数值是val
void delete_list (PNODE phead,int pos) ; //删除第pos个节点
void sort_list (PNODE phead) ;
int main (void)
{
PNODE phead = NULL ;
phead = create_list () ;
traverse_list (phead) ;
printf ("该链表的长度是length=%d\n",length_list(phead)) ;
insert_list (phead , 3 ,9) ;
printf ("在第三个元素后面插入 9\n") ;
traverse_list (phead) ;
printf ("在删除第二个元素\n") ;
delete_list (phead , 2) ;
traverse_list (phead) ;
sort_list (phead) ;
traverse_list (phead) ;
return 0 ;
}
PNODE create_list (void)
{
PNODE phead = (PNODE) malloc (sizeof (NODE)) ;
if (NULL == phead)
{
printf ("分配内存出错!\n") ;
exit (-1) ;
}
int len ;
int val ; // 存放临时值
int i ;
printf ("请输入节点个数len = ") ;
scanf ("%d", &len) ;
phead->pnext = NULL ;
PNODE ptail = phead ; //ptail 是尾结点
for (i=0; i<len; i++)
{
printf ("请输入第%d个节点的数值:",i+1) ;
scanf ("%d",&val) ;
PNODE pnew = (PNODE) malloc(sizeof (NODE)) ;
pnew->data = val ;
ptail->pnext = pnew ;
pnew->pnext = NULL ;
ptail = pnew ;
}
return phead ;
}
void traverse_list (PNODE phead)
{
// 错误写法 原因是头结点不存放数据 phead->data 是个垃圾值
/*while (phead->pnext != NULL)
{
printf ("%d ",phead->data) ;
phead = phead->pnext ;
}
输入 : 1 2 3 输出结果 213242 1 2
*/
PNODE p = phead->pnext ;
//while (p->pnext !=NULL ) 这样输出 少一个最后数据 这样理解 尾结点的数据域是NULL,即他指向的下个节点的地址是NULL
while (p != NULL )
{
printf ("%d ",p->data) ;
p = p->pnext ;
}
printf ("\n") ;
return ;
}
bool is_empty (PNODE phead)
{
if (phead->pnext ==NULL )
return true ;
else
return false ;
}
int length_list (PNODE phead)
{
int i = 0;
PNODE p = phead->pnext ;
while (p != NULL)
{
i++;
p = p->pnext ;
}
return i ;
}
void insert_list (PNODE phead,int pos,int val) //在第pos个节点后面插入节点 数值是val
{
PNODE pnew = (PNODE) malloc (sizeof (NODE)) ;
pnew->data = val ;
PNODE p = phead->pnext ; //p 指向首节点
int i ;
for (i=1; i<pos; i++)
{
p = p->pnext ;
}
pnew->pnext = p->pnext ;
p->pnext = pnew ;
return ;
}
void delete_list (PNODE phead,int pos) //删除第pos个节点
{
PNODE p = phead->pnext ;
int i ;
for (i=1;i<pos-1;i++)
{
p = p->pnext ;
}
PNODE t = p->pnext ;
p->pnext = p->pnext->pnext ;
free (t) ;
return ;
}
void sort_list (PNODE phead)
{
int i ,j ;
PNODE p,q ;
int len = length_list (phead) ;
for (i=0,q=phead->pnext; i<len-1; i++,q=q->pnext)
{
for (j=0,p=phead->pnext; j<len-1-i; j++,p=p->pnext)
{
if (p->data > p->pnext->data)
{
int t ;
t = p->data;
p->data = p->pnext->data;
p->pnext->data = t;
}
}
}
}