数据结构:2. C/C++实现单链表基本操作(源码)

287 阅读2分钟

文件名:singleLinkList.cpp

代码:

    #include <stdio.h>
    #include <stdlib.h>

    typedef int ElemType;

    // 结构体
    typedef struct LNode
    {
      ElemType data;
      struct  LNode *next;
    } LNode, *LinkList;


    // 分配头结点,建立空表
    void InitLinkList(LinkList &L) {
      L = (LinkList)malloc(sizeof(LNode));
      L->next = NULL;
    }

    // 头插法建立单链表
    void HeadInsertLinkList(LinkList &L) {
      LNode *s;
      ElemType x;

      printf("请输入你要插入的元素,以0结束: \n");
      scanf("%d", &x);
      while(x != 0) {
        s = (LNode*)malloc(sizeof(LNode));
        s->data = x;
        s->next = L->next;
        L->next = s;
        scanf("%d", &x);
      }
    }

    // 尾插法建立单链表
    void TailInsertLinkList(LinkList &L) {
      LNode *s, *r = L;
      ElemType x;

      printf("请输入你要插入的元素,以0结束: \n");
      scanf("%d", &x);
      while(x != 0) {
        s = (LNode*)malloc(sizeof(LNode));
        s->data = x;
        r->next = s;
        r = s;
        scanf("%d", &x);
      }
      r->next = NULL;
    }

    // 单链表长度,不包含头结点
    int GetLinkListLength(LinkList L) {
      int length = 0;
      LNode *s = L->next;

      while(s != NULL) {
        length++;
        s = s->next;
      }
      return length;
    }

    // 按序号查找结点:返回第i个结点的指针,若无,返回NULL
    LNode *GetLNode(LinkList L, int i) {
      int j = 1;
      LNode *p = L->next;
      int length = GetLinkListLength(L);

      if (i < 0 || i > length + 1) {
        printf("序号不合法 \n");
        return NULL;
      }

      if (i == 0) {
        return L;
      }

      while(j < i) {
        p = p->next;
        j++;
      }
      return p;
    }

    // 按值查找表结点:返回该结点的指针,若无,返回NULL
    LNode *LocationLNode(LinkList L, ElemType e) {
      LNode *p = L->next;
      while(p && p->data != e) {
        p = p->next;
      }
      return p;
    }

    // 插入结点(后插):将值为x的新结点插入到单链表的第i个位置上(后插)
    void InsertLinkList(LinkList &L, int i, ElemType e) {
      int length = GetLinkListLength(L);
      LNode *p = GetLNode(L, i-1);
      LNode *s = (LNode*)malloc(sizeof(LNode));

      if (i < 0 || i > length + 2) {
        printf("序号不合法 \n");
        return;
      }

      s->data = e;
      s->next = p->next;
      p->next = s;
    }

    // 删除结点(后删):将单链表的第i个结点删除,不可删除头结点
    void DeleteLNode(LinkList &L, int i) {
      int length = GetLinkListLength(L);
      LNode *p = GetLNode(L, i-1), *q;

      if (i <= 1 || i > length + 1) {
        printf("序号不合法 \n");
        return;
      }

      q = p->next;
      p->next = q->next;
      free(q);
    }

    // 输出单链表
    void PrintLinkList(LinkList L) {
      LNode *s = L->next;
      int length = GetLinkListLength(L);

      if (length == 0) {
        printf("单链表为空 \n");
        return;
      }

      printf("当前单链表元素: ");
      while (s != NULL)
      {
        printf("%d ", s->data);
        s = s->next;
      }
      printf("\n");
    }

    // 销毁单链表
    void DestroyLinkList(LinkList &L) {
      LNode *d;

      while(L->next != NULL) {
        d = L;
        L = L->next;
        free(d);
      }
      printf("销毁单链表成功 \n");
    }

    int main() {
      LinkList L;
      int i,length;
      ElemType e;
      LNode *p;

      printf("----------------初始化----------------\n");
      InitLinkList(L);
      printf("----------------头插法建立单链表----------------\n");
      HeadInsertLinkList(L);
      PrintLinkList(L);
      printf("----------------表长----------------\n");
      length = GetLinkListLength(L);
      printf("当前单链表长度:%d \n", length);
      printf("----------------销毁单链表----------------\n");
      DestroyLinkList(L);
      PrintLinkList(L);
      printf("----------------尾插法建立单链表----------------\n");
      TailInsertLinkList(L);
      PrintLinkList(L);
      printf("----------------按序号查找结点----------------\n");
      printf("请输入序号:");
      scanf("%d", &i);
      p = GetLNode(L, i);
      printf("查找结点值为:%d \n", p->data);
      printf("----------------按值查找结点----------------\n");
      printf("请输入值:");
      scanf("%d", &e);
      p = LocationLNode(L, e);
      printf("查找结点值为:%d \n", p->data);
      printf("----------------插入结点----------------\n");
      printf("请输入序号:");
      scanf("%d", &i);
      printf("请输入值:");
      scanf("%d", &e);
      InsertLinkList(L, i, e);
      PrintLinkList(L);
      printf("----------------删除结点----------------\n");
      printf("请输入序号:");
      scanf("%d", &i);
      DeleteLNode(L, i);
      PrintLinkList(L);

      return 0;
    }