Inicialización, destrucción de la lista vinculada individualmente, establecer en tabla vacía, buscar longitud de tabla, juzgar vacío, buscar por bit, buscar por valor, insertar, eliminar, establecer antes de insertar, después de insertar, imprimir

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode     //单链表的存储结构定义
{
	ElemType data;     //数据域
	struct LNode *next;  //指针域
}LNode,*LinkList;                 //*LinkList为LNode类型的指针   LNode *p  ==  LinkList p
enum Status{ERROR,OK};
LinkList L,r;

Status InitList_L(LinkList &L)   //初始化,构造一个空链表
{
	L=(LinkList)malloc(sizeof(LNode));
	if(L==NULL)
		return ERROR;
	L->next=NULL;
	return OK;
}

Status DestoryList(LinkList &L)  //销毁链表
{
 LinkList pre=L; //前驱结点
 LinkList p=L->next;  //当前结点
 while(p!=NULL);
 {
   free(pre);
   pre=p;
   p=p->next;
 }
 free(pre);  //释放最后一个结点
 printf("销毁成功\n");
 return OK;
}

Status DestoryList_L(LinkList &L)
{
  LinkList p;
  while (L)
  {
    p=L;
	L=L->next;
	free(p);
  }
  return OK;
}
Status ClearList(LinkList &L) //将L置为空表
{
  LinkList p,q;
  p=L->next;
  while(p)
  {
   q=p->next;
   free(p);
   p=q;
  }
  L->next=NULL;
  return OK;
}

int ListLength(LinkList L)  //求表长,返回元素个数
{
  LinkList p;
  p=L->next;  //因为头结点不计数
  int i=0;
  while(p)  //遍历单链表,统计结点数
  {
   i++;
   p=p->next;
  }
  return i;
}

Status ListEmpty(LinkList L)  //判断是否为空表
{
 if(L->next)
 return ERROR;
 else
  return OK;

}

LinkList LocateElem_L(LinkList L,ElemType e)  //返回L中值为e的地址,查找失败返回NULL
{
 LinkList p;
 p=L->next;
 while(p&&p->data!=e)
 {
  p=p->next;
 }
 return p;
}

Status GetElem_L(LinkList L,int i,ElemType *e) //输入位置,返回数据域
{
	LinkList p;
	int j=1;
	p=L->next;
	for(j = 1; p!=NULL && j == i; j++)
    {
	p = p->next;
    }
    if(p == NULL || j > i)
    {
	return ERROR;
    }
	
	*e=p->data;
	return OK;
}

int LocateElem(LinkList L,ElemType e)  //返回L中值为e的数据元素的位置序号,查找失败返回0
{
  LinkList p;
  p=L->next;
  int j=1;
  while(p&&p->data!=e)
  {
   p=p->next;
   j++;
  }
  if(p)
   return j;
   else
   return 0;
} 

Status LinkInsert_L(LinkList &L,int i,ElemType e)  //在第i个元素之前插入数据元素e
{
   LinkList p=L,s;
   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;
}
int LinkDelete(LinkList &L,int i,ElemType *e)  //删除单链表的某个结点
{
 LinkList p=L,q;
 //ElemType e;
 int j=0;
 while(p&&j<i-1)
 {
	 p=p->next;
	 j++;
 }
 if(!p||j>i-1)
  printf("位置不合理\n");  //删除位置不合理
 q=p->next; //保存被删结点的地址,以备释放
 p->next=q->next;  //改变被删结点的前驱结点
 *e=q->data; //保存删除结点的数据域
 free(q);  //删除空间
 return 1;
}

Status  CreateList_F(LinkList &L,int n)  //输入的数据域会逆置,所以建议逆序输入
{
  LinkList p;
  L=(LinkList)malloc(sizeof(LNode));
  if(L==NULL)
	  return ERROR;
  L->next=NULL;
  for(int i=n;i>0;i--)
  {
	  p=(LinkList)malloc(sizeof(LNode));
	  scanf("%d",&p->data);
	  p->next=L->next;
	  L->next=p;
  }
  return OK;
}

Status CreateList_L(LinkList &L,int n)
{
	LinkList p;
	L=(LinkList)malloc(sizeof(LNode));
	if(L==NULL)
		return ERROR;
	L->next=NULL;
	r=L;   //r始终指向尾结点
	for(int i=0;i<n;i++)
	{
       p=(LinkList)malloc(sizeof(LNode));
	   scanf("%d",&p->data);
	   p->next=NULL;
	   r->next=p;
	   r=p;    //r指向新的尾结点
	}
	return OK;
}

Status Print(LinkList L)
{
	LinkList p;
	p=L->next;
	while(p)
	{
		printf("%d-> ",p->data);
		p=p->next;
	}
	printf("NULL\n");
	printf("\n");
	return OK;
}

main()
{
	LinkList L;
	int i,n;
	ElemType e;
	InitList_L(L);

	printf("输入结点个数\n");
	scanf("%d",&n);
	printf("输入数据域\n");
	CreateList_F(L,n);
    printf("此时得到了逆序的链表\n");
    Print(L);	
    
	printf("此时,销毁链表....\n");

	printf("输入结点数据域\n");
	CreateList_L(L,n);
	printf("此时得到正序的链表\n");
	Print(L);

	printf("插入结点,现在输入 位置,以及数据\n");
	scanf("%d %d",&i,&e);
	LinkInsert_L(L,i,e);
	Print(L);

	printf("删除结点,现在输入位置\n");
	scanf("%d",&i);
	if(LinkDelete(L,i,&e))
	{
		printf("删除:%d ",e);
	    Print(L);
	}

	printf("输入位置,返回它的数据域\n");
	scanf("%d",&i);
	GetElem_L(L,i,&e);
	printf("当位置合理时,得到了 :%d\n",e);

	printf("查找:输入元素,返回单链表中的位置序号,以及地址\n");
	scanf("%d",&e);
	if(LocateElem(L,e))
    printf("位置序号:%d;地址:%d\n",LocateElem(L,e),LocateElem_L(L,e));
	else
	printf("没有找到\n");
	printf("\n");

	printf("清空链表\n");
	ClearList(L);

	printf("求表长\n");
	printf("求表长\n");
	printf("长度为:%d\n",ListLength(L));










}
57 artículos originales publicados · Me gustaron 54 · Visitas 2333

Supongo que te gusta

Origin blog.csdn.net/September_C/article/details/105544625
Recomendado
Clasificación