c语言--线性表的链式存储

#include "stdio.h"
#include "malloc.h"
#define datatype int
#define   ERROR 0
#define OK  1
typedef int ElemType;
typedef struct node
{  
	datatype data;        //链表的数据域
   struct node *next;    //链表的指针域
} LNode,*LinkList;

LinkList  Creat_LinkList1( ) //头插入法建立单链表算法
{  
	LinkList head;
	LNode *s;
	head=(LinkList)malloc(sizeof(LNode));
	head->next=NULL;
	char flag='Y';
 
	while(flag=='Y'||flag=='y'){
		s=(LNode *)malloc(sizeof(LNode));
		printf("请输入新节点数据:");
		scanf("%d",&s->data);
		s->next=head->next;
		head->next=s;
		getchar();
		printf("继续输入吗?(Y/N):");
		scanf("%c",&flag);
	}
	return (head->next);
}

/*按序号查找 Get_Linklist(L,i)
在单链表L中查找第i个元素结点,找到返回其指针,否则返回空*/
LNode *Get_LinkList(LinkList L,int i)
{
	int j;
 LNode *p;
 p=L;
 j=0;
 while((p->next!=NULL)&&(j<i))
 {
	 p=p->next;
	 j++;
 }
 if(i==j)
	 return p;
 else
	 return NULL;
}
 

/*插入运算 Insert_LinkList(L,i,x)
在单链表L的第i个位置上插入值为x的元素*/
int  Insert_LinkList(LinkList  L, int i, datatype  x)     
{	

	int j=0;   
	LinkList p=L,s;  
	while(j<i-1&&p!=NULL)  
	{    
		j++;    
		p=p->next;    
}    
	if(p==NULL)     
   return false;  
  else    
  {    
	  s=(LNode *)malloc(sizeof(LNode));     
	  s->data=x;   
	  s->next=p->next;    
	  p->next=s;     
	  return true;  
  }
}

/*删除运算:Del_LinkList(L,i)
删除单链表L上的第i个数据结点*/
int  Del_LinkList(LinkList  L,int i)   
{	
	char e;
	int j=0;  
	LinkList p=L,q;   
	while(j<i-1&&p!=NULL)   
	{      
		j++;   
		p=p->next; 
   }    
	if(p==NULL)     
		return false;   
	else   
	{      
		q=p->next;    
		if(q==NULL)     
			return false;    
		e=q->data;     
		p->next=q->next;  
		free(q);     
		return true;    
}
}
void print(LinkList L)           //输出单链表
{   LNode *p=L;
    while(p->next!=NULL)
	{ printf("%d\t",p->data);    //输出表中非最后一个元素
      p=p->next; 
	}
    printf("%d\n",p->data);      //输出表中最后一个元素    
}

void main()
{ 
	LinkList  H;
    int i,j,k;
	datatype x;
	do
    {  
	printf("\n\n\n\n");
    printf("\t\t\t 链表子系统\n");
	printf("\t\t*******************************\n");
	printf("\t\t*        1----建    表     *\n");
	printf("\t\t*        2----插    入    *\n");
	printf("\t\t*        3----删  除    *\n");
	printf("\t\t*        4----查  找    *\n");
	printf("\t\t*        5----显  示    *\n");
	printf("\t\t*        0----返  回    *\n");
	printf("\t\t*******************************\n");
	printf("\t\t 请选择菜单项(0-5):");
	scanf("%d",&k);getchar();
	if (k==1)
    	H=Creat_LinkList1( );      //用头插入法建立单链表
	else if (k==2)       //在线性表第i位置处插入值为X的元素
	{
		printf("\n   请输入插入的位置i和数据X(输入格式:i,X):");
		scanf("%d,%d",&i,&x);
		j=Insert_LinkList(H,i,x);
	}
	else if (k==3)
	{	printf("\n   请输入要删除元素的位置i:");
		scanf("%d",&i);
		j=Del_LinkList(H,i);
		if (j == 1) printf("删除成功!!");
		else printf("删除失败!!");		
	}
	else if (k==4)       //查找线性表中元素值为x的位置
	{	printf("\n   请输入要查找的序号i:");
		scanf("%d",&i);
		LNode  *p;
		p=Get_LinkList(H,i);
		if (p!=NULL) 
		{ print(H);printf("中序号为i的地址是 %d ",p);}
		else
		printf("链表中无此序号!!\n");
	}
	 else if (k==5)        //输出链表
	 {	printf("\n表的存储顺序为:");
        print(H);  
	}
	}while(k!=0);
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
说明:1.这个是鄙人大二期间所学,所以模板很多人都用过,如有雷同,不是偶然。
2.发博客只为了纪念所学所感,于此而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SIR步步留心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值