无头单链表


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

typedef int datatype;
typedef struct link_node
{
	datatype info;
	struct link_node *next;//指向下一个数据结点的指针
}node;

node *init()/*建立一个空的单链表*/
{
	return NULL;
}

void display(node *head)/*输出单链表各个节点的值*/
{
	node *p=head;/*node *p;p=head;*/
	if(!p)       //p==NULL
		printf("单链表是空的!");
	else
	{
		printf("\n单链表各个结点的值为:\n");
		while(p)
		{
			printf("%5d",p->info);
			p=p->next;
		}
	}
}

node *find(node *head,int i)/*在单链表中查找第i个结点*/
{                           
	node *p=head;
	int j=1;
	if(i<1)
		return NULL;
	while(p&&i!=j)
	{
		p=p->next;
		j++;
	}
	return p;
}

int find2(node *head,int x)/*查找值为x的结点*/
{
	node *p=head;
	int i=1;
	while(p)
	{
		if(p->info==x)
		{
			return i;
			break;
		}
		else if(p->info==NULL)
		{
			return 0;
			break;
		}
		else 
		{
			p=p->next;
			i++;
		}
	}
}

node *insert(node *head,datatype x,int i)/*在单链表中第i个位置插入一个值为x的新结点*/
{
	node *q,*p;
	q=find(head,i);
	if(!q&&i!=0)
		printf("\n找不到第%d个结点,不能插入!\n",i);
	else
	{
		p=(node*)malloc(sizeof(node));/*分配空间*/
		p->info=x;                    /*设置新结点*/
		if(i==0)             /*插入的结点作为单链表的第一个结点*/
		{
			p->next=q;
			head=p;
		}
		else
		{
			p->next=q->next;
			q->next=p;/*在第i个位置后插入x*/
		}
	}
	return head;
}

node *dele(node *head,datatype x)/*在单链表中删除一个值为x的结点*/
{
	node *p,*pre=NULL;
	if(!head)
	{
		printf("\n单链表是空的,无法删除!\n");
		return head;
	}
	p=head;
    while(p&&p->info!=x)//没有找到并且没有找完
	{
	    pre=p;
		p=p->next;
	}
	if(p)
	{
		if(!pre)//删除第一个结点
		{
			head=head->next;
			free(p);
		}
		else
		{
			pre->next=p->next;
			free(p);
		}
	}
	return head;
}

node *creat()/*给单链表赋值,以‘0’结束*/
{
	int n=0;
	node *p,*q,*head;
	p=q=(node*)malloc(sizeof(node));
	head=NULL;    //分配头指针为空
	scanf("%d",&p->info);
	while(p->info!=0)
	{
		++n;
		if(n==1)
			head=p;
		else
			q->next=p;
		q=p;
		p=(node*)malloc(sizeof(node));
		scanf("%d",&p->info);
	}
	q->next=NULL;
	return head;
}

node  *first(node *head,datatype x)/*在单链表最前面插入x*/
{
	node *p;
	p=(node*)malloc(sizeof(node));//malloc分布动态内存
	p->info=x;
	p->next=head;
	head=p;
	return head;
}

node *reverse(node *head)
{

}
int main()
{
	node *head;
	int a,i;
	datatype x;
	while(1)
	{
	printf("/***********************************************************/\n");
	printf("/*    1.建立一个空的单链表       2.给单链表输入数据        */\n");
	printf("/*    3.输出单链表各节点的值     4.在单链表中查找第i个结点 */\n");
	printf("/*    5.值为x的结点位置          6.在第i个节点位置插入x    */\n");
	printf("/*    7.删除一个值为x的结点      8.在第一个结点前插入x     */\n");
	printf("/*    9.退出                                               */\n");
	printf("/***********************************************************/\n");
	scanf("%d",&a);
	switch(a)
	{
	case 1:
		{
		head=init();
		printf("\n操作完成!请继续。\n");
		break;
		}
	case 2:
		{
			head=creat();
			printf("\n操作完成!请继续。\n");
			break;
		}
	case 3:
		{
			display(head);
			printf("\n操作完成!请继续。\n");
			break;
		}
	case 4:
		{
			printf("请输入你需要查找的结点:");
			scanf("%d",&i);
			printf("第i个结点为:%d",find(head,i)->info);
			printf("\n操作完成!请继续。\n");
			break;
		}
	case 5:
		{
			printf("请输入你需要查找的值:");
			scanf("%d",&x);
			printf("查找的数的结点数为:%d",find2(head,x));
			printf("\n操作完成!请继续。\n");
			break;
		}
	case 6:
		{
			printf("请输入第i个位子:");
			scanf("%d",&i);
			printf("请输入你需要插入的数x:");
			scanf("%d",&x);
			head=insert(head,x,i);
			printf("\n操作完成!请继续。\n");
			break;
		}
	case 7:
		{
			printf("请输入你需要删除的数:");
			scanf("%d",&x);
			head=dele(head,x);
			printf("\n操作完成!请继续。\n");
			break;
		}
	case 8:
		{
			printf("请输入你需要插入的数 x:");
			scanf("%d",&x);
			head=first(head,x);
			printf("\n操作完成!请继续\n");
			break;
		}
	case 9:
		{
	printf("程序结束!\n");
		return 0;
	}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值