【数据结构】单链表上的基本运算

来源:互联网 发布:淘宝商品如何推广 编辑:程序博客网 时间:2024/06/06 14:08

1.初始化

<span style="font-family:KaiTi_GB2312;font-size:18px;">//建立一个空的单链表LinkList InitiateLinkList( ){     LinkList  head;              //头指针     head = malloc(sizeof(node));  //动态构建一个节点,它是头结点     head ->next = NULL;     return  head;}</span>

2.求表长

//求单链表表head的长度int LentghLinklist ( LinkList head ){      Node * p = head;           //p是工作指针,初始时p指向头结点      int cnt = 0;               //计数器置初值      while(p->next != NULL)     //判断是否为尾节点      {           p = p->next;         //指针移动到下一个节点           cnt ++;       }      return cnt;}

3.读表元素

//在单链表head中查找第i个元素节点,若找到,则返回指向该节点的指针,否则返回NULLNode * GetLinklist(LinkList head,int i){      Node *p;                             //p是工作指针      p = head ->next;                     //初始时p指向头结点      int c = 1;        while ( (c<i) && (p != NULL) )       //当未到第i结点且未到尾节点时继续后移      {             p = p->next;             c++;      }      if ( i == c )   return p;            //找到第i个节点      else return NULL;                    //i<1 或 i>n ,i值不合法,查找失败}

4.定位

//求表head中第一个值等于x的结点的序号,若不存在这种结点,返回结果为0int LocateLinklist( LinkList head , DataType x){      Node * p = head;                     //p是工作指针      p = p->next;                         //初始时p指向首结点      int i=0;                             //i代表结点的序号,这里置初值为0      while (p!= NULL && p->data !=x)      //访问链表      {             i++;             p = p->next;      }      if (p!= NULL ) return i+1;      else return 0;}

5.插入

//在表head的第i个数据元素结点之前插入一个以x为值的新结点void InsertLinklist ( LinkList head , DataType x,int i ){      Node *p , *q;      if ( i == 1) q = head;      else q = GetLinklist (head ,i-1);          //找第i-1个数据元素结点      if (q == NULL )                            //第i-1个结点不存在            exit ("找不到插入的位置");      else            {                   p = malloc ( sizeof(Node));                   p->data = x;                  //生成新结点                   p->next = q->next;            //新结点链域指向*q的后继结点                   q->next = p;                  //修改*q的链域            }}
6.删除

//删除表head的第i个结点void DeleteLinklist (LinkList head,int i){      Node *p;      if(i==q) q=head;      else q=GetLinklist(head,i-1);          //先找到待删除结点的直接前驱      if(q!=NULL && q->next != NULL)         //若直接前驱存在且待删除结点存在      {             p=q->next;                      //p指向待删除结点             q->next=p->next;                //移出待删结点             free(p);                        //释放已移出结点p的空间      }      else exit ("找不到要删除的结点");      //结点不存在}


1 0