1. 程式人生 > >單鏈表的建立,節點的插入,刪除,遍歷(未完善版)

單鏈表的建立,節點的插入,刪除,遍歷(未完善版)

#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;
		}
	}
}