C语言数据结构单链表的一些基本操作

#include <stdio.h>
#include <stdlib.h>

typedef struct ListNode   
{                          //单链表存储结构
	int data;              //数据域
	struct ListNode * next;//指针域
}LNode, * pNode;           //LNode等价于struct ListNode
                           //pNode等价于struct ListNode *
/*--------------------创建链表-----------------------*/                          
pNode CreateList()     
{
	pNode head, p, q;      //head为头结点,p为新结点,q连接所有的结点
	head=q=(pNode)malloc(sizeof(LNode));  //为头结点申请空间
	head->next=NULL;                      //头结点的数据域为空,它的数据域一般没实际意义
	int x;
	printf("请输入数据,以0结束\n");
	scanf("%d", &x);
	while(x != 0)
	{
		p = (pNode)malloc(sizeof(LNode)); //满足条件申请空间生成新的结点
		p->data = x;                      //x的值赋值给新结点
		p->next = NULL;                   //x的下一个结点未知,置空
		q->next = p;                      //q连接下一个结点p
		q = p;                            //q后移到新结点,准备连接下一个新的结点
		scanf("%d", &x);

	}
	return head;                          //返回头结点
}
/*------------------输出链表---------------------*/
void PrintList(pNode pHead)                
{
	pNode node=pHead->next;               //定义一个结点保存头结点的下一个结点
	if(NULL == node)                      //判断链表是否为空
	{
		printf("链表为空\n");
	}
	while(node != NULL)                   //输出链表的数据域
	{
		printf("%-3d",node->data);
		node = node->next;                //输出一个结点node后移,准备输出下一个结点
	}
	printf("\n");
}
/*-------------------链表的长度-------------------*/
int Lenthlist(pNode pHead)               
{
	pNode node=pHead->next;               //定义一个结点保存头结点的下一个结点
	int len = 0;                          //len计算表长
	if(NULL == node)                      //判断链表是否为空
	{
		printf("链表长度为0\n");
		return len;
	}
	while(node != NULL)                   
	{
		++len;                            //结点存在,len自加
		node = node->next;                //输出一个结点node后移
	}
	return len;
}
/*------------------查询数据-----------------*/
int FindVal(pNode pHead, int val)         //说明:查到了就返回1,并没有说明查到数据的位置
{
	pNode node = pHead->next;
	while(node != NULL)
	{ 
		if(val == node->data)
			return 1;                     //数据存在返回1
		node = node->next;
	}
	return 0;                             //数据不存在返回0
}
/*-------------------位置查询-------------------*/
int Findpos(pNode pHead, int posnode, int *val) 
{
	int len = Lenthlist(pHead);           //先求表长,判断查询的位置是否合法
	pNode node = pHead->next;
	int s = 0;                            //计算第几个结点
	if(posnode<1 && posnode>len)          //查询位置不合法返回0
		return 0;
	else
	{
		while(node != NULL)
		{
			s++;
			if(s == posnode)              //查询位置
			{
				*val = node->data;        //位置合法,所对应的的数据通过指针返回给主函数
				break;
			}
			node = node->next;
		}
	}
	return 1;
}
/*------------------按位置删除结点-----------------*/
pNode DeletNode(pNode pHead, int pos)        
{
	pNode node = pHead;                     //保存头结点
	int len = Lenthlist(pHead)+1;           //头结点也算入链表长
	int s=0;
	if(pos<1 || pos>=len)                   //删除的结点的位置不合法
	{
		printf("你要删除的位置不存在\n");
		return pHead;
	}
	else
	{
		s++;                                
		while(node->next != NULL && s<pos)  //先找到要删除结点前面的那一个结点
		{
			node = node->next;              
			s++;
		}
		pNode q = node->next;               //保存删除的结点
		node->next = q->next;               //删除结点的前一个结点链接删除结点的下一个结点
		free(q);                            //释放删除结点的空间
		return pHead;
	}
}
/*----------------插入结点-----------------*/
pNode InsertNode(pNode pHead, int inserval, int pos)
{
	pNode node = pHead;						             
	int len = Lenthlist(pHead)+1;            //加上了头结点的链表的长度
	int s=0;
	if(pos<1 || pos>len)                     //判断插入的位置是否合法
	{
		printf("你要插入的位置不合法\n");
		return pHead;
	}
	while(node!=NULL && s<pos-1)             //找到插入结点的前一个位置
	{                                        //这也就是为什么要把头结点算入链表的长度
		node = node->next;
		s++;
	}                                        
	pNode newnode = (pNode)malloc(sizeof(LNode)); //申请一个结点的空间
	newnode->data = inserval;                     //把插入的数据赋值给新结点的数据域
	newnode->next = node->next;				      //新结点的指针域指向插入位置的结点
	node->next = newnode;                         //插入位置的前一个结点的指针域指向新结点
	return pHead;                                 //返回头结点
}
/*-----------------链表的逆置------------------*/
pNode ReverseList(pNode phead)
{
	pNode q, p = phead->next;
	phead->next = NULL;
	while(p != NULL)
	{
		q = p->next;
		p->next = phead->next;
		phead->next = p;
		p = q;
	}
	return phead;
}
/*------------------销毁链表-----------------*/
pNode DeleteList(pNode phead)
{
	pNode q, p = phead;
	while(p!=NULL)
	{
		q = p;
		p = p->next;
		free(q);
	}
 
	return phead;	
}

int main()
{
	pNode HeadNode;                     //头结点
	int length = 0;                     //链表长度

	int valnode = 0;                    //查询的数据
	int valfinal = 0;                   //查询数据后的结果

	int posnode = 0;                    //位置查询
	int posfinal = 0;					//位置查询后的结果
	int posval = 0;                     //位置查询到的数据

	int delpos = 0;                     //删除结点的位置

	int inval = 0;                      //插入的数据
	int inpos = 0;                      //插入的位置

	HeadNode = CreateList();        //创建链表后的头结点

	length = Lenthlist(HeadNode);      //统计链表结点

/*--------------输出链表的长度----------------*/
//	printf("链表长度为:%d\n", length); //输出表长

//	PrintList(HeadNode);              //输出链表

/*-----------------查询数据-------------------*/
/*	printf("请输入你要查找的数据\n");
	scanf("%d", &valnode);
	valfinal = FindVal(HeadNode, valnode);
	if(valfinal == 1)
		printf("你要查找的数据存在\n");
	else
		printf("你要查找的数据不存在\n");

*/
/*-----------------位置查询-------------------*/
/* 	printf("请输入你要查询第几个结点:");
	scanf("%d",&posnode);
	posfinal = Findpos(HeadNode, posnode, &posval);
	if(posfinal == 0)
		printf("你要查询的位置不合法\n");
	else
		printf("第%d个结点的数据为:%d\n", posnode, posval);
*/
/*------------------删除结点-----------------*/
/*	printf("请输入要删除结点的位置:\n");
	scanf("%d", &delpos);
	HeadNode = DeletNode(HeadNode, delpos);
	printf("删除结点后的链表:\n");
	PrintList(HeadNode);   
*/
/*------------------插入结点-----------------*/
/*	printf("请输入要插入的数据:");
	scanf("%d",&inval);
	printf("请输入要插入的位置:");
	scanf("%d",&inpos);
	HeadNode = InsertNode(HeadNode, inval, inpos);
	PrintList(HeadNode);  
*/
/*-----------------链表的逆置------------------*/
/*	HeadNode = ReverseList(HeadNode);
	PrintList(HeadNode);     */
/*------------------销毁链表-----------------*/
	HeadNode = DeleteList(HeadNode);
    if(HeadNode)
		printf("链表空!");

	return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值