初期化、シングルリンクリストの破棄、空のテーブルに設定、テーブルの長さの検索、空の判定、ビットによる検索、値による検索、挿入、削除、挿入前の確立、挿入後、印刷

#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件 高く評価54件 訪問数2333

おすすめ

転載: blog.csdn.net/September_C/article/details/105544625