SCAU8579、SCAU8580、SCAU8581 链式表的基本操作

这篇文章是一份纯代码分享。

代码包含了线性表的链式实现时的基本函数,包括:

CreateLinkList、DestroyLinkList、ClearLinkList、LinkListEmpty、LinkListLength

GetElem、LocateElem、PriorElem、NextElem、LinkListInsert、LinkListDelete、Traverse

以及为完成SCAU8579、SCAU8580、SCAU8581的必要函数和代码段。

//此项目功能:完成链式表的基本操作以及OJ给出的三道题:8579、8580、8581
#include <stdio.h>
#include <malloc.h>
#define ElemType int
#define Status int
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef struct LNode
{
  ElemType data;
  struct LNode *next;
} LNode, *LinkList;

Status CreateLinkList(LinkList &L, int n)
{
  LinkList tail, p;
  ElemType e;
  L = new LNode;
  L->data = 0;
  L->next = NULL;
  tail = L;
  for (int i = 0; i < n; i++)
  {
    scanf("%d", &e);
    p = new LNode;
    p->data = e;
    p->next = NULL;
    tail->next = p;
    tail = p;
    L->data++;
  }
  return OK;
}

Status DestroyLinkList(LinkList &L)
{
  LinkList p = L->next, q;
  L->next = NULL;
  while (p)
  {
    q = p->next;
    delete p;
    p = q;
  }
  delete L;
  return OK;
}

Status ClearLinkList(LinkList &L)
{
  LinkList p = L->next, q;
  L->next = NULL;
  while (p)
  {
    q = p->next;
    delete p;
    p = q;
  }
  return OK;
}

Status LinkListEmpty(LinkList L)
{
  if (L->next)
    return FALSE;
  else
    return TRUE;
}

int LinkListLength(LinkList L)
{
  return L->data;
}

Status GetElem(LinkList L, int i, ElemType &e)
{
  if (i > L->data || i < 1)
    return ERROR;
  else
  {
    LinkList p = L;
    for (int j = 0; j < i; j++)
      p = p->next;
    e = p->data;
  }
  return OK;
}

int LocateElem(LinkList L, ElemType e)
{
  int i = 1;
  LinkList p = L->next;
  for (; p; p = p->next)
  {
    if (p->data == e)
      return i;
    i++;
  }
  return 0;
}

Status PriorElem(LinkList L, ElemType cur_e, ElemType &pre_e)
{
  int Location = LocateElem(L, cur_e);
  if (Location == 0 || Location == 1)
    return ERROR;
  else
    GetElem(L, Location - 1, pre_e);
  return OK;
}

Status NextElem(LinkList L, ElemType cur_e, ElemType &next_e)
{
  int Location = LocateElem(L, cur_e);
  if (Location == 0 || Location == L->data)
    return ERROR;
  else
    GetElem(L, Location + 1, next_e);
  return OK;
}

Status LinkListInsert(LinkList &L, int i, ElemType e)
{
  if (i < 1 || i > L->data + 1)
    return ERROR;
  else
  {
    LinkList p = new LNode;
    p->data = e;
    p->next = NULL;
    LinkList q = L;
    for (int j = 1; j < i; j++)
      q = q->next;
    p->next = q->next;
    q->next = p;
    L->data++;
  }
  return OK;
}

Status LinkListDelete(LinkList &L, int i, ElemType &e)
{
  if (i < 1 || i > L->data)
    return ERROR;
  else
  {
    LinkList p = L;
    for (int j = 1; j < i; j++)
      p = p->next;
    LinkList q = p->next;
    e = q->data;
    p->next = q->next;
    delete q;
    L->data--;
  }
  return OK;
}

Status Traverse(LinkList L)
{
  if (LinkListEmpty(L))
  {
    printf("The List is empty!\n");
    return ERROR;
  }
  else
  {
    //printf("The LinkList is:");
    LinkList p = L->next;
    while (p)
    {
      printf("%d ", p->data);
      p = p->next;
    }
    printf("\n");
  }
  return OK;
}

void PreMerge(LinkList &C, LinkList &A)
{
  ElemType x;
  LinkListDelete(A, 1, x);
  LinkListInsert(C, C->data + 1, x);
}

void Merge(LinkList &C, LinkList &A, LinkList &B)
{
  while (A->data && B->data)
  {
    if (A->next->data == B->next->data)
    {
      PreMerge(C, A);
      PreMerge(C, B);
    }
    else if (A->next->data < B->next->data)
      PreMerge(C, A);
    else
      PreMerge(C, B);
  }
  while (A->data || B->data)
  {
    while (A->data)
      PreMerge(C, A);
    while (B->data)
      PreMerge(C, B);
  }
}

void TurnLinkList(LinkList &L)
{
  for (int i = 0; i < L->data; i++)
  {
    ElemType x;
    LinkListDelete(L, 1, x);
    LinkListInsert(L, L->data + 1 - i, x);
  }
}

void FuctionsTest(LinkList &L)
{
  int a, i;
  ElemType e, x;
  ElemType cur_e, pre_e, next_e;
  while (1)
  {
    scanf("%d", &a);
    switch (a)
    {
    case 1:
      CreateLinkList(L, 0);
      break;
    case 2:
      ClearLinkList(L);
      break;
    case 3:
      scanf("%d", &i);
      if (!GetElem(L, i, e))
        printf("GetElem Error.\n");
      else
        printf("%d\n", e);
      break;
    case 4:
      scanf("%d", &e);
      if (!LocateElem(L, e))
        printf("LocateElem Error.\n");
      else
        printf("%d\n", LocateElem(L, e));
      break;
    case 5:
      scanf("%d", &cur_e);
      if (!PriorElem(L, cur_e, pre_e))
        printf("No cur_e or no pre_e.\n");
      else
        printf("%d\n", pre_e);
      break;
    case 6:
      scanf("%d", &cur_e);
      if (!NextElem(L, cur_e, next_e))
        printf("No cur_e or no next_e.\n");
      else
        printf("%d\n", next_e);
      break;
    case 7:
      scanf("%d%d", &i, &x);
      if (!LinkListInsert(L, i, x))
        printf("Insert Error!\n");
      else
        printf("The Element %d is Successfully Inserted!\n", x);
      break;
    case 8:
      scanf("%d", &i);
      if (!LinkListDelete(L, i, e))
        printf("Delete Error!\n");
      else
        printf("The Element %d is Successfully Deleted!\n", e);
      break;
    case 9:
      Traverse(L);
      break;
    case 0:
      return;
    }
  }
}

int main()
{
  /*SCAU 8579
   LinkList T;
   int a,n,i;
   ElemType x, e;
   printf("Please input the init size of the linklist:\n");
   scanf("%d",&n);
   printf("Please input the %d element of the linklist:\n", n);
   if(CreateLinkList(T,n))
   {
  	 printf("A Link List Has Created.\n");
  	 Traverse(T);
   }
   while(1)
  	{
  		printf("1:Insert element\n2:Delete element\n3:Load all elements\n0:Exit\nPlease choose:\n");
  		scanf("%d",&a);
  		switch(a)
  		{
  			case 1: scanf("%d%d",&i,&x);
  				  if(!LinkListInsert(T,i,x)) printf("Insert Error!\n");
  				  else printf("The Element %d is Successfully Inserted!\n", x);
  				  break;
  			case 2: scanf("%d",&i);
  				  if(!LinkListDelete(T,i,e)) printf("Delete Error!\n");
  				  else printf("The Element %d is Successfully Deleted!\n", e);
  				  break;
  			case 3: Traverse(T);
  				  break;
  			case 0: return 1;
  		}
  	}
  /*
  /*SCAU 8580
  LinkList A,B,C;
  CreateLinkList(A,0);
  CreateLinkList(B,0);
  CreateLinkList(C,0);
  int a,b;
  scanf("%d", &a);
  for (int i = 0; i < a; i++)
  {
    int x;
    scanf("%d", &x);
    LinkListInsert(A,A->data+1,x);
  }
  scanf("%d", &b);
  for (int i = 0; i < b; i++)
  {
    int x;
    scanf("%d", &x);
    LinkListInsert(B,B->data+1,x);
  }
  printf("List A:");
  Traverse(A);
  printf("List B:");
  Traverse(B);
  Merge(C,A,B);
  printf("List C:");
  Traverse(C);
  */
  /*SCAU 8581
  LinkList L;
  CreateLinkList(L,0);
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++)
  {
    int x;
    scanf("%d", &x);
    LinkListInsert(L,L->data+1,x);
  }
  printf("The List is:");
  Traverse(L);
  TurnLinkList(L);
  printf("The turned List is:");
  Traverse(L);
  */
  /*
  LinkList L;
  FuctionsTest(L);
  */
  return 0;
}

欢迎讨论交流。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值