数据结构(C语言)线性表 -单链表

/*
    链式存储:不要求逻辑上相邻的元素在物理位置上也相邻,
	          摒弃顺序存储结构上的缺点,但也失去了顺序表随机存取的优点。
	单链表:只含有一个指针域,头指针没有数据域,尾指针的指针域为空。
 */

//--------线性表的单链表存储结构---------
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct LNode {
    
	ElemType data;
	struct LNode *next;

}LNode,*LinkList;
//建立单链表:(1)头插法,(2)尾插法。

void CreatList_Head_Insret(LinkList &L,int n){
   
	LinkList p;
	L=(LinkList)malloc(sizeof(LNode));   //动态分配内存;
	L->next=NULL;                        //建立一个带头结点的单链表。
	for(int i=n;i>0;--i) 
	{
         p=(LNode*)malloc(sizeof(LNode));
	     scanf("%d",&p->data);
		 p->next=L->next;  
		 L->next=p;
	}
	printf("头插法逆序建立单链表");


}

//逆序建立单链表。
void CreatList_End_Insert(LinkList &L,int n){
  
	
	LinkList p,r;
	L=(LinkList)malloc(sizeof(LNode));   //动态分配内存;
	L->next=NULL;                        //建立一个带头结点的单链表。
	r=L;
	for(int i=0;i<n;i++) 
	{
         p=(LNode*)malloc(sizeof(LNode));
	     scanf("%d",&p->data);
		 p->next=r->next;  
		 r->next=p;
		 r=p;                                    //将p置为头;
	}
	printf("尾插法顺序建立单链表");


}

Status GetElem_L(LinkList L,int i,ElemType &e){

	//L为带头结点的单链表指针
	//当i个元素存在时,其赋值给e并返回OK
	LinkList p;
	int j=1;
	p=L->next;
	while(p&&j<i) {
		
		p=p->next;	++j;
	}
	if(!p||j>i)  return ERROR;
	e=p->data;
	return OK;

}
//插入算法
Status ListInsert_L(LinkList &L,int i,ElemType e){
    
	LinkList s,p=L;
	int j=0;
	while(p&&j<i-1)
	{//寻找第i-1个节点
		p=p->next;
		++j;
	}
	if(!p||j>i-1)  return ERROR;
	s=(LinkList)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return OK;

}

//删除算法
Status ListDelete_L(LinkList &L,int i,ElemType &e){
   
	LinkList p=L,q;
	int j=0;
	while(p->next&&j>i-1) {  //寻找第i个结点,并让p指向它的前驱。
	
		p=p->next; ++j;
	}
	if(!p->next||j>i-1) return ERROR;
	q=p->next; p->next=q->next;
	e=q->data; free(q);
	return OK;
}

void Print(LinkList &L) {
   
	LinkList p=L->next;
	while(p!=NULL) 
	{
		printf("%3d",p->data);
		p=p->next;
	}
    printf("\n");
}
void main()
{
	LinkList L;
	ElemType e;
	int n;
	printf("输入n个数据:");
	scanf("%d",&n);
	CreatList_Head_Insret(L,n);
    Print(L);
//	CreatList_End_Insert(L,5);
//	Print(L);
//  GetElem_L(L,2,e);
//	printf("%d\n",e);
	ListInsert_L(L,1,30);
	ListInsert_L(L,1,5);
	Print(L);
	ListDelete_L(L,1,e);
	ListDelete_L(L,1,e);
	Print(L);
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值