单链表基本操作

//vs2005

#include "stdafx.h"
#include <iostream>
typedef struct node
{
	int data;
	struct node *next;
}LNode,*LinkList;


/*创建链表:创建一个有头结点的链表,头结点不存放数据,数据从第二个结点(表头结点)开始存放。
	有没有头结点链表的插入、删除、打印等操作会不同,有头结点通常操作起来更方便,例如可以方便的支持
	只有一个节点的链表删除结点。

	同时注意,对链表的操作中,插入和删除令p1=head,逆置令p1=head->next
	前者有利于遍历

*/
LinkList creat()
{
	LinkList head,p,s; 
	int x,flag=1;
	head=(LinkList)malloc(sizeof(LNode));//头指针
	p=head;
	printf("输入若干整数并以空格隔开,以回车结束:\n");
	char ch=' ';
	while(ch!='\n')
	{
		scanf("%d",&x);
		ch=getchar();//getchar要放在scanf后面
		if(flag)
		{
			s=(LinkList)malloc(sizeof(LNode));
			s->data=x;
			//printf("%d",s->data);
			//printf("\n");
			p->next=s;//输入的第一个数作为第二个结点(表头结点)
			p=s;
		}
		else flag=0;
	}
	
	p->next=NULL;
	printf("创建成功:\n");
	return head;
}


/*
	删除节点:两种情况
	(1)删除第i个结点,直接删除即可
	(2)删除值为num的结点,要遍历整个链表,找出所有值为num的结点,全部删除

下面的代码考虑较复杂的第二种情况(也可以使用递归实现)
	
*/

LinkList del(LinkList head,int num)
{
	LinkList p1,p2;
	p1=head;
	while(p1->next!=NULL)
	{
		if(num!=p1->next->data)
		{
			p1=p1->next;
		}
		else
		{
			p2=p1->next;
			p1->next=p1->next->next;
			free(p2);
		}
	}

	
	
	return head;

}


//逆置单链表
LinkList reverse(LinkList head)
{
	LinkList p1,p2,p3;
	//p1=head;
	p1=head->next;
	if(p1==NULL)return head;
	if(p1->next!=NULL)
	{
		p2=p1->next;
		p1->next=NULL;
		while(p2->next!=NULL)
		{			
			p3=p2->next;
			p2->next=p1;
			p1=p2;
			p2=p3;
		}
		p2->next=p1;
		head->next=p2;
	}

	printf("逆置成功:\n");
	return head;
}




/*插入操作,常见的操作有:
(1)插入到指定位置
(2)插入到有序链表中,插入后仍然保持有序
*/
LinkList insert(LinkList head)
{
	 LinkList p0,p1,p2;
	 int num;
	 p1=head;
	 p0=(LinkList)malloc(sizeof(LNode));
	 printf("请输入一个要插入的整数并回车:\n");
	 char ch=' ';
	 while(ch!='\n')
	 {
		scanf("%d",&num);
		ch=getchar();
	 }
	 
	 p0->data=num;
	 if(head->next==NULL)
	 {
		head->next=p0;
		p0->next=NULL;
		return head;
	 }

	 while(p1->next!=NULL&&p0->data>p1->next->data)
		 p1=p1->next;


	 if(p1->next==NULL)
	 {
		 p1->next=p0;
		 p0->next=NULL;
	 }
	 else if(p0->data<=p1->next->data)
	 {		
		 p0->next=p1->next;
		 p1->next=p0;	
	 }
	 printf("插入成功:\n");
	 return head;

}


//打印链表
void print(LinkList head)
{

	LinkList p;
	if(head->next!=NULL)
	{
		p=head->next;
		
			while(p->next!=NULL)
			{
				printf("%d->",p->data);
				p=p->next;
			}
			printf("%d",p->data);

	}
	
	printf("\n");
	
	

}
int _tmain(int argc, _TCHAR* argv[])
{


	LinkList p;
	p=creat();
	print(p);
	int num;
	printf("你要删除哪个元素,请输入:\n");
	scanf("%d",&num);
	p=del(p,num);
	print(p);
	p=insert(p);
	print(p);
	p=reverse(p);
	print(p);
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值