单链表的建立,节点的插入,删除,遍历(未完善版)

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

#define OK      1
#define ERROR   0
typedef int ElemType;
typedef int Status; 

typedef struct LinkNode
{
	ElemType data;
	struct LinkNode *next;
}LinkNode,*LinkList;

Status CreatLinkList(LinkList *L )
{
	LinkList r,p,ptr;
	(*L)=(LinkNode*)malloc(sizeof(LinkNode));
	r=*L;
	ptr=*L;
	while(1)
	{
		p=(LinkNode*)malloc(sizeof(LinkNode));
		scanf("%d",&p->data);
		//	p->data=*Node_Value;
		r->next=p;
		r=p;
		if(r->data==0)  
		{
			break;
		}
	}
	r->next=NULL;
	
	return OK;
}

Status  DeleteLastNode(LinkList *L)
{
	LinkList ptr,ptr1;
	ptr=*L;
	while(ptr->next!=NULL)
	{
		ptr1=ptr;
		ptr=ptr->next; 
	}                     // printf("%d",ptr->data);while(1);
	ptr1->next=NULL;
	free(ptr);
	return OK;
}
Status LinkListInsert(LinkList *L,int &Insert_Pos,ElemType &Insert_Value)
{
	LinkList k,s;
	k=*L;
	int j=1;    // printf("%d",k->next->data);
	if(!k)
	{
		 
		return ERROR;
	}                         
	while(k&&j<Insert_Pos)
	{
		k=k->next;
		j++;
	}
	s =(LinkList)malloc(sizeof(LinkNode));
	s->data=Insert_Value;
	s->next=k->next;
	k->next=s;

	return OK;

}
Status  LinkListDelete(LinkList *L,int num)
{
	LinkList z,p;
	p=*L;
	int j=1;
	/*for(int i=0;i<num-1;i++)
	{
		z=z->next; 
	}*/
	while(j<num)
	{
		p=p->next;
		j++;
	}
	z=p->next;   printf("%d",z->data);while (1);
	{

	}
	p->next=z->next;      
	free(z);
	return  OK;
}

Status GetNodeLength(LinkList *L)
{
	LinkList p;
	int NodeNum=0;
	p=*L;
	while (p->next!=NULL)
	{
		p=p->next;
		NodeNum++;
	}

	return NodeNum;
}

void ShowLinkList(LinkList L)
{
	printf("*************链表中的元素************\n");
	LinkNode *node=L->next;// printf("%d ",L->next->data);
	while(node)
	{
	
		printf("%d ",node->data);
		node=node->next;
	}
	
	printf("\n");
}
Status GetNodeLocation(LinkList *L, int e,int GetNodeLength)
{
	LinkList p;
	p=*L;
	int j=1;
	while(j<GetNodeLength)
	{
			p=p->next;
		
			if(p->data==e)
			{
				break;
			}
				j++;
	}
	return j;
}


int main()
{
	int LinkNode_num,Opt_num,Node_Value,Insert_Value,Insert_Pos;
	printf("1.初始化链表\n");
	printf("2.插入节点\n");
	printf("3.删除节点\n");
	printf("4.返回节点所在位置\n");
	printf("5.遍历链表\n");
	printf("0.退出\n\n");
	printf("请选择你的操作:");
		
	LinkList L; 
	int k,j,i,m;
	int flag=0;
	while(1)
	{
		scanf("%d",&Opt_num);
	
		switch (Opt_num)
		{
		case 1:
			printf("请输入节点的值,输入0完成初始化\n");
			
				//scanf("%d",&Node_Value);
			CreatLinkList(&L);
			DeleteLastNode(&L);
			k=GetNodeLength(&L); //printf("%d",k);while (1);
			
			//LinkListDelete(&L,k);
			ShowLinkList(L);
			break;
		case 2:
			printf("请选择插入的位置:");
			scanf("%d",&Insert_Pos);
			printf("输入要插入节点的值:");
			scanf("%d",&Insert_Value);  
			LinkListInsert(&L,Insert_Pos,Insert_Value);
		
			ShowLinkList(L);
			break;
		case 3:
			printf("输入删除节点的位置:\n");
			scanf("%d",&j);
			LinkListDelete(&L,j);
			printf("删除%d节点后",j);
			ShowLinkList(L);
			break;
		case 4:
			printf("你要查找第几个节点的值所在位置:");
			scanf("%d",&i);
			k=GetNodeLength(&L);
			m=GetNodeLocation(&L,i,k);
			printf("节点所在的位置:%d\n",m);

			break;
		case 5:
			ShowLinkList(L);
			break;
		case 0:
			flag++;
			break;
		    default:
			    break;
		}
		if (flag==1)
		{
			 break;
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值