LinkList

来源:互联网 发布:淘宝全棉时代有假货吗 编辑:程序博客网 时间:2024/05/01 19:02
// LinkList.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

#define   TRUE  1
#define   FALSE  0
#define   OK   1
#define   ERROR 0
#define   INFEASIBLE  -1
#define   OVERFLOW  -2

typedef   int   Status;
typedef struct
{
 int data;
}ElemType;

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

Status GetElem_L(LinkList L, int i, ElemType& e);
Status ListInsert_L(LinkList &L, int i, ElemType e);
Status ListDelete_L(LinkList &L, int i, ElemType &e);
void CreateList_L(LinkList &L, int n);
void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc);

void ShowList(LinkList &L);

int main()
{
 LinkList testL,La,Lb,Lc;
 CreateList_L(testL, 6);
 ShowList(testL);
 ElemType e1,temp;
 e1.data = 11;
 ListInsert_L(testL, 3, e1);
 ShowList(testL);
 ListDelete_L(testL, 4, temp);
 ShowList(testL);
 printf("\n删除的节点值为%d", temp.data);
 
 GetElem_L(testL, 2, temp);
 printf("\n获取节点2处的值%d\n", temp.data);

 CreateList_L(La, 3);
 CreateList_L(Lb, 4);
 CreateList_L(Lc, 0);
 ShowList(La);
 ShowList(Lb);
 MergeList_L(La, Lb, Lc);
 ShowList(Lc);

 system("pause");
    return 0;
}

Status GetElem_L(LinkList L, int i, ElemType& e)
{
 LNode* p = L->next;
 int j = 1;
 while (p&&j < i)
 {
  p = p->next;
  ++j;
 }
 if (!p || j>i)return ERROR;
 e = p->elem;
 return OK;
}

Status ListInsert_L(LinkList &L, int i, ElemType e)
{
 LNode * p = L->next;
 int j = 1;
 while (p&&j < i-1)
 {
  p = p->next;
  ++j;
 }
 if (!p || j>i-1)return ERROR;
 LNode* node =(LNode*)malloc(sizeof(LNode));
 node->elem = e;
 LNode* q = p->next;
 p->next = node;
 node->next = q;
 return OK;
}

Status ListDelete_L(LinkList &L, int i, ElemType &e)
{
 LNode *p = L->next;
 int j = 1;
 while (p->next&&j < i - 1)//注意此处为p->next,因为若是p,则出来的p可能为空
 {
  p = p->next;
  ++j;
 }
 if (!p->next || j>i - 1)return ERROR;
 LNode*q= p->next;
 e = q->elem;
 p->next = p->next->next;
 free(q);
 return OK;
}

void CreateList_L(LinkList &L, int n)
{
 printf("输入节点的值");
// L = (LinkList)malloc(n*sizeof(LNode)); 如果像这样创建的话,那就是生成连续存储空间的线性表,应该单独对每一个节点分配内存空间
 L = (LinkList)malloc(sizeof(LNode));
 L->next = nullptr;//先生成一个表头的单链表
 for (int i = n;i > 0;--i)
 {
  LNode* pnode = (LinkList)malloc(sizeof(LNode));
  scanf_s("%d",&pnode->elem.data);
  pnode->next = L->next;//插入方式为向表头的后一个插入,不然插在表尾太麻烦
  L->next = pnode;
 }
}

void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc)
{
 LNode* pa = La->next;
 while (pa->next)
 {
  pa = pa->next;
 }
 pa->next = Lb->next;
 Lc->next = La->next;
 free(La);
 free(Lb);
}

void ShowList(LinkList &L)
{
 printf("\n链表为:");
 LNode* pNode = L->next;
 while (pNode)
 {
  printf("--%d", pNode->elem.data);
  pNode = pNode->next;
 }
}
0 0
原创粉丝点击