c语言单链表

  •        1.创建菜单 
  •        2.创建单链表
  •        2.1先创建指针结构体
  •        2.2创建单链表头结点
  •        2.3头插法创建元素
  •        2.4尾插法创建元素
  •        3.插入元素
  •        3.1按位置插入元素
  •        4.查找元素
  •        4.1按位置查找元素
  •        4.2按数值查找位置 
  •        5.删除元素
  •         5.1按位置删除元素
  •        6.显示全部单链表元素 
  •        7.库函数
  •        8.全部代码

 1.创建菜单 

void menu(){
	
   	 printf("\t\t\t----------------单链表---------------------\n");
	 printf("\t\t\t1.创建单连表         \n");
	 printf("\t\t\t2.添加元素           \n");
	 printf("\t\t\t3.查询元素           \n");
	 printf("\t\t\t4.删除元素           \n");
	 printf("\t\t\t5.退出               \n");
	 printf("\t\t\t请输入你的选择:"); 
	
	
}

2.创建单链表

 2.1先创建指针结构

//结构体 
typedef struct Node{
	ElemType data;
	struct Node *next;
}Node,*Linklist;

 2.2创建单链表头结点

Status InitList(Linklist *L)                     //初始化产生头结点 
{
	 *L=(Linklist)malloc(sizeof(Node));
	 if(!(*L))
	  return FALSE;
	  
	  (*L)->next=NULL;
	  
	  return OK;
} 

    2.3头插法创建元素

void CreateListHead(Linklist *L,int n)             //头插法添加元素 
{
	
	Linklist p;
    
	srand(time(0));
	int i;
	for(i=0;i<n;i++)
	{
		
		p=(Linklist)malloc(sizeof(Node));
		
		 p->data=rand()%100+1;
		 p->next=(*L)->next;
		(*L)->next=p;
	}
}

2.4尾插法创建元素

void CreateListTail(Linklist *L,int n)             //尾插法添加元素 
{
	
	Linklist p,r;	
	srand(time(0));
	r=*L;
	
	for(int i=0;i<n;i++)
	{
	  p=(Linklist)malloc(sizeof(Node));
	  p->data=rand()%100+1;
	  p->next=r->next;
	  r->next=p;
	  r=p;
	    	
	}
	 r->next=NULL;
	
}

  3.插入元素

 3.1按位置插入元素

Status ListInsert(Linklist *L,int i,ElemType *e)          //按位置插入数据 
{
	Linklist p,q;
	
	int j=1;
	p=*L;
	
	while(p&&i>j)  //如果输入i的值给单链表的长度还要大于,意思就是不是插在最后,而是插在比最后还要多一位。 
	{                      //此时p->next=NULL 
		p=p->next;
		++j;                 //while---if:这个两个不能调位置,不然起不了效果 
	}
	if(!p||j>i)            //p->data=NULL==1
	{
		printf("输入有误!请重新输入:\n"); 
		return FALSE;
	}
	q=(Linklist)malloc(sizeof(Node));
	q->data=*e;
	q->next=p->next;
	p->next=q;

	return OK;
	
 } 

 4.查找元素

4.1按位置查找元素

Status LocateElem1(Linklist L,int i)                 //1.输入位置查找数据 
{

	int j=1;
	
	Linklist p;
	p=L;
	
	while(p&&i>j)            //while---if:这个两个不能调位置,不然起不了效果 。 
	{
	
		p=p->next;		
		++j;
	}
	
	if(!p||j>i)
	{
		printf("输入有误!请重新输入:\n"); 
		return FALSE;
	}
   		
	printf("第%d个=[%d]\n\n",i,p->next->data);
	
}

  4.2按数值查找位置 

Status  LocateElem2(Linklist L,ElemType  e)           //2.输入数据查找位置 
{
	Linklist p=L->next;
	
	int i=1;
	
	while(p)
	{
		  	  
		if(p->data==e)
		
		return i;

		p=p->next; 
	       
		++i;	
	}
	
	printf("单链表中没有%d,请重新输入。\n",e);
	
	return ERROR; 
	
 } 

 5.删除元素

  5.1按位置删除元素


Status   ListDelete(Linklist *L,int i,ElemType *e)       //输入位置删除元素 
{
	
	Linklist p,q;         //创建两个指针
	int j=1;
	p=*L;
	while(p&&i>j)
	{
		p=p->next;
		++j;
	}
	if(!p||j>i)
	{
		printf("输入有误,请重新输入!\n");
		
		return ERROR; 
	}
	q=p->next;
	*e=q->data;
	p->next=q->next;
    	free(q);
        	return OK;	
}

     6.显示全部单链表元素 

Status ListTraverse(Linklist L)               //显示出全部数据 
{
	 Linklist p;
	 p=L->next;
	 int i=1;
	 while(p)
	 {
     	printf("第%2d个->data=[%d]\n",i,p->data);
	 	p=p->next;
	 	i++;
	 }
	 printf("\n");
	 
	 return OK;
}

 7.库函数

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<ctype.h>
#include<math.h>
#include<string.h>


#define  TRUE   1
#define    OK   1
#define   FALSE 0
#define   ERROR 0

typedef    int  ElemType;
typedef    int  Status; 

//结构体 
typedef struct Node{
	ElemType data;
	struct Node *next;
}Node,*Linklist;

Linklist L;          //这个是全局变量,不能缺少

   8.全部代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<ctype.h>
#include<math.h>
#include<string.h>


#define  TRUE   1
#define    OK   1
#define   FALSE 0
#define   ERROR 0

typedef    int  ElemType;
typedef    int  Status; 

//结构体 
typedef struct Node{
	ElemType data;
	struct Node *next;
}Node,*Linklist;

Linklist L;                                     //这个是全局变量 
    

Status InitList(Linklist *L)                     //初始化产生头结点 
{
	 *L=(Linklist)malloc(sizeof(Node));
	 if(!(*L))
	  return FALSE;
	  
	  (*L)->next=NULL;
	  
	  return OK;
} 

void CreateListHead(Linklist *L,int n)             //头插法添加元素 
{
	
	Linklist p;
    
	srand(time(0));
	int i;
	for(i=0;i<n;i++)
	{
		
		p=(Linklist)malloc(sizeof(Node));
		
		 p->data=rand()%100+1;
		 p->next=(*L)->next;
		(*L)->next=p;
	}
}


void CreateListTail(Linklist *L,int n)             //尾插法添加元素 
{
	
	Linklist p,r;	
	srand(time(0));
	r=*L;
	
	for(int i=0;i<n;i++)
	{
	  p=(Linklist)malloc(sizeof(Node));
	  p->data=rand()%100+1;
	  p->next=r->next;
	  r->next=p;
	  r=p;
	    	
	}
	 r->next=NULL;
	
}

Status ListInsert(Linklist *L,int i,ElemType *e)          //按位置插入数据 
{
	Linklist p,q;
	
	int j=1;
	p=*L;
	
	while(p&&i>j)          //如果输入i的值给单链表的长度还要大于,意思就是不是插在最后,而是插在比最后还要多一位。 
	{                      //此时p->next=NULL 
		p=p->next;
		++j;                 //while---if:这个两个不能调位置,不然起不了效果 
	}
	if(!p||j>i)            //p->data=NULL==1
	{
		printf("输入有误!请重新输入:\n"); 
		return FALSE;
	}
	q=(Linklist)malloc(sizeof(Node));
	q->data=*e;
	q->next=p->next;
	p->next=q;

	return OK;
	
 } 
Status LocateElem1(Linklist L,int i)                 //1.输入位置查找数据 
{

	int j=1;
	
	Linklist p;
	p=L;
	
	while(p&&i>j)            //while---if:这个两个不能调位置,不然起不了效果 。 
	{
	
		p=p->next;		
		++j;
	}
	
	if(!p||j>i)
	{
		printf("输入有误!请重新输入:\n"); 
		return FALSE;
	}
   		
	printf("第%d个=[%d]\n\n",i,p->next->data);
	
}

Status  LocateElem2(Linklist L,ElemType  e)           //2.输入数据查找位置 
{
	Linklist p=L->next;
	
	int i=1;
	
	while(p)
	{
		  	  
		if(p->data==e)
		
		return i;

		p=p->next; 
	       
		++i;	
	}
	
	printf("单链表中没有%d,请重新输入。\n",e);
	
	return ERROR; 
	
 } 


Status   ListDelete(Linklist *L,int i,ElemType *e)       //输入位置删除元素 
{
	
	Linklist p,q;         //创建两个指针
	int j=1;
	p=*L;
	while(p&&i>j)
	{
		p=p->next;
		++j;
	}
	if(!p||j>i)
	{
		printf("输入有误,请重新输入!\n");
		
		return ERROR; 
	}
	q=p->next;
	*e=q->data;
	p->next=q->next;
    	free(q);
        	return OK;	
}

Status ListTraverse(Linklist L)               //显示出全部数据 
{
	 Linklist p;
	 p=L->next;
	 int i=1;
	 while(p)
	 {
     	printf("第%2d个->data=[%d]\n",i,p->data);
	 	p=p->next;
	 	i++;
	 }
	 printf("\n");
	 
	 return OK;
}

void menu(){
	
   	 printf("\t\t\t----------------单链表---------------------\n");
	 printf("\t\t\t1.创建单连表         \n");
	 printf("\t\t\t2.添加元素           \n");
	 printf("\t\t\t3.查询元素           \n");
	 printf("\t\t\t4.删除元素           \n");
	 printf("\t\t\t5.退出               \n");
	 printf("\t\t\t请输入你的选择:"); 
	
	
}

int main(){
	  
    char ans='y';  
    InitList(&L);
    
while(ans=='Y'||ans=='y'){

  	 menu();
  	 
	 int choose;	 
	 scanf("%d",&choose);
	 switch(choose){
	 	case 1:{
	 		int i,n;
	 		printf("本程序提供两种创建单链表方式 1.头插法创建 ,2.尾插法创建。\n");
			 printf("请输入(1/2):");
			 scanf("%d",&i); 
	
			if(i==1){
				printf("请输入创建多少位单链表:");
				scanf("%d",&n);
				CreateListHead(&L,n);          //头插法 
			}
	 	
	 		else if(i==2 ) {
	 			printf("请输入创建多少位单链表:");
	 		    scanf("%d",&n);
			    CreateListTail(&L,n);                   //尾插法 
		     }
		    else 
			printf("输入有误!");
			  
	 		ListTraverse(L);
	 		
			break;
		 }
		 case 2:{
		 	int  i,e;
 		 	printf("请输入你想插入数据的位置:");
 		 	scanf("%d",&i);
			printf("请输入数据:");
			scanf("%d",&e); 
		 	ListInsert(&L,i,&e);                      //按位值插入 
			ListTraverse(L); 
			
			break;
		 }
		 case 3:{
		 	
		
		 	int choose;
		 	
		 	printf("本程序提供两种查询方法 1.按位置查找元素。2.输入元素查找位置。\n");
			printf("请输入(1/2):"); 
			scanf("%d",&choose);
		 	switch(choose){
		 		case 1:{
		 			    int i;
		 			    printf("请输入该元素位置:");
		 			    scanf("%d",&i);
		 				LocateElem1(L,i);           //按位置查询元素 
					break;
				 }
				 case 2:{
				 	    int result,e; 
				 	    printf("请输入元素的数据:");
						scanf("%d",&e); 
				 		result=LocateElem2(L,e); 
				 		if(result)
				 		printf("元素 %d 位于 %d",e,result);
					break;
				 }
				 default:{
				   	  printf("输入有误!"); 
					  break;
				 }
			 }
			break;
		 }
		 case 4:{
		 	
		 	int i,e;
		 	printf("请输入你想删除的元素位置:");
		 	scanf("%d",&i);
		 	ListDelete(&L,i,&e);                    //按位置删除元素 
		 	if(e)
		 	{
		 	printf("删除第%d个的元素值为:%d\n",i,e);
			printf("删除后的单链表:\n");
		 	ListTraverse(L); 
		    }
			break;
		 }
		 	
		  default:{
		  		printf("退出成功。再见!!!");
			break;
		  }	
	  }
	  
	     if(choose>0 && choose<5){
	     	 printf("\n是否继续,如果'是'请输入(Y/y),'否'请输入任意值:");
	     	scanf("%s",&ans);	
		 }else{
		 	break;
		 }
		 
} 
	  
}

 9.结果显示

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值