zoukankan      html  css  js  c++  java
  • 线性表链式存储单链表的基本操作

      1  /*线性表链式存储-单链表的基本操作*/
      2#include "stdafx.h"
      3    #include <stdio.h>
      4    #include <malloc.h>
      5    typedef char ElemType;
      6    struct LNode
      7    {
      8       ElemType data;
      9       struct LNode *next;
     10    }
    ;
     11
     12    //***********************************************************置空表setnull()
     13    void setnull(struct LNode **p)
     14    {
     15      *p=NULL;
     16    }

     17
     18    //************************************************************求长度length()
     19    int length(struct LNode **p)
     20    {
     21      int n=0;
     22      struct LNode *q=*p;
     23      while (q!=NULL)
     24      {
     25        n++;
     26        q=q->next;
     27      }

     28      return(n);
     29    }

     30
     31    //*************************************************************取结点get()
     32    ElemType get(struct LNode **p,int i)
     33    {
     34       int j=1;
     35       struct LNode *q=*p;
     36       while (j<&& q!=NULL) /*查找第i个结点*/
     37       {
     38         q=q->next;j++;
     39       }

     40       if (q!=NULL)  /*找到了第i个结点*/
     41           return(q->data);
     42       else
     43       {
     44           printf("位置参数不正确!\n");
     45           return NULL;
     46       }

     47    }

     48
     49    //************************************************************按值查找locate()
     50    int locate(struct LNode **p,ElemType x)
     51    {
     52      int n=0;
     53      struct LNode *q=*p;
     54      while (q!=NULL && q->data!=x) /*查找data域为x的第一个结点*/
     55      {
     56        q=q->next;
     57        n++;
     58      }

     59      if (q==NULL)  /*未找到data域等于x的结点*/
     60         return(-1);
     61      else          /*找到data域等于x的结点*/
     62         return(n+1);
     63    }

     64
     65    //**********************************************************插入结点insert()
     66    void insert(struct LNode **p,ElemType x,int i)
     67    {
     68       int j=1;
     69       struct LNode *s,*q;
     70       s=(struct LNode *)malloc(sizeof(struct LNode)); /*建立要插入的结点s*/
     71       s->data=x;
     72       q=*p;
     73       if (i==1/*插入的结点作为头结点*/
     74       {
     75         s->next=q;
     76         *p=s;
     77       }

     78       else
     79       {
     80          while (j<i-1 && q->next!=NULL) /*查找第i-1个结点*/
     81          {
     82             q=q->next;j++;
     83          }

     84          if (j==i-1/*找到了第i-1个结点,由q指向它*/
     85          {
     86            s->next=q->next; /*将结点s插入到q结点之后*/
     87            q->next=s;
     88          }

     89          else 
     90              printf("位置参数不正确!\n");
     91        }

     92    }

     93
     94    //*********************************************************删除结点del()
     95    void del(struct LNode **p,int i)
     96    {
     97      int j=1;
     98      struct LNode *q=*p,*t;
     99      if (i==1)  /*删除链表的头结点*/
    100      {
    101        t=q;
    102        *p=q->next;
    103      }

    104      else
    105      {
    106         while (j<i-1 && q->next!=NULL)  /*查找第i-1个结点*/
    107         {
    108            q=q->next;j++;
    109         }

    110
    111         if (q->next!=NULL && j==i-1/*找到第i-1个结点,由q指向它*/
    112         {
    113            t=q->next;        /*t指向要删除的结点*/
    114            q->next=t->next;  /*将q之后的结点删除*/
    115         }

    116         else printf("位置参数不正确!\n");
    117      }

    118      if (t!=NULL) /*在t不为空时释放该结点*/
    119         free(t);
    120    }

    121
    122    //********************************************************显示链表display()
    123    void display(struct LNode **p)
    124    {
    125      struct LNode *q;
    126      q=*p;
    127      printf("单链表显示:");
    128      if (q==NULL)  /*链表为空时*/
    129      printf("链表为空!");
    130      else if (q->next==NULL) /*链表只有一个结点时*/
    131          printf("%c\n",q->data);
    132      else {                  /*链表存在一个以上的结点时*/
    133          while (q->next!=NULL)  /*显示前面的结点*/
    134          {
    135            printf("%c→",q->data);q=q->next;
    136          }

    137
    138          printf("%c",q->data);  /*显示最后一个结点*/
    139       }

    140
    141      printf("\n");
    142    }

    143
    144 void   main()
    145    {
    146      struct LNode *head;
    147      setnull(&head);
    148      insert(&head,'a',1);
    149      insert(&head,'b',2);
    150      insert(&head,'a',2);
    151      insert(&head,'c',4);
    152      insert(&head,'d',3);
    153      insert(&head,'e',1);
    154      display(&head);
    155      printf("单链表长度=%d\n",length(&head));
    156      printf("位置:%d  值:%c\n",3,get(&head,3));
    157      printf("值:%c 位置:%d\n",'a',locate(&head,'a'));
    158      printf("删除第1个结点:");
    159      del(&head,1);
    160      display(&head);
    161      printf("删除第5个结点:");
    162      del(&head,5);
    163      display(&head);
    164      printf("删除开头3个结点:");
    165      del(&head,3);
    166      del(&head,2);
    167      del(&head,1);
    168      display(&head);
    169}

    170
    171/*
    172运行结果:
    173单链表显示:e→a→a→d→b→c
    174单链表长度=6
    175位置:3  值:a
    176值:a 位置:2
    177删除第1个结点:单链表显示:a→a→d→b→c
    178删除第5个结点:单链表显示:a→a→d→b
    179删除开头3个结点:单链表显示:b
    180*/
  • 相关阅读:
    ubuntu>雷鸟只能收邮件不能发邮件
    ubuntu>安装jdk(转)
    ubuntu>修改root密码
    ios>Could not instantiate class named NSLayoutConstraint(转)
    ios>xcode4.5 如何找到以前的iphone模拟器(转)
    Windows7系统开始菜单改成经典样式
    ASP.NET多语言版的开发
    Dynamic repositories in LightSpeed
    Enhancing queries in dynamic repositories
    C# 4.0 Dynamic关键字全解析
  • 原文地址:https://www.cnblogs.com/yuxi/p/645398.html
Copyright © 2011-2022 走看看