数据结构--链表(C实现)

链表是学习数据结构的基础,何为数据结构,简单来说就是研究数据的存储问题,算法是对数据的操作问题,存储主要是个人的存储和个人与个人的关系的存储,研究如何将我们现实生活中各种事物及其关系的存储。
链表的优缺点(相比于同是线性结构的数组): 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;
			}
		}
		
	}
	
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值