单链表。

// 实验四单链表实现代码
//#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
typedef int DataType;

typedef  struct LNode {
  DataType   data;    /*存储结点值*/
  LNode  *next;           /*链表下一结点的地址*/
}LNode,*LinkList;

/*1.初始化链表函数,返回带头结点的单链表的头指针*/
struct LNode * InitList(){
    struct LNode *pHead=(struct LNode *) malloc(sizeof(LNode));//为链表的头指针分配内存空间
    if(pHead!=NULL)
            pHead->next=NULL;
    return pHead;
}

/*在带头结点的单链表中,查找第i(1≤i≤n)个结点,如果找到,则返回该结点的存储位置,否则返回NULL */
LNode *Locate(LNode *head,int i){
    int k;    
    LNode *p=head;
    for(k=0;k<i;k++){
         if(p==NULL) return NULL;
         p=p->next; //移动指针
    }
    return p;
}

//在第i个节点之前添加数据y,成功添加返回该节点的指针,否则返回空
struct LNode *InsertNode(struct LNode *head,int i,DataType y){
    struct LNode *p=Locate(head,i-1);//先获取在第i个节点之前的指针
    struct LNode *s;
    if(p!=NULL){
       s=(LNode *) malloc(sizeof(LNode));//分配新节点的内存空间
       if(s==NULL) return NULL;
       s->data=y;
       s->next=p->next;  //添加数据
       p->next=s;
    }
    return p;
}

//删除第i个节点的数据,成功删除返回1,否则返回-1
 int DelNode(LNode *head,int i){
    struct LNode *p=Locate(head,i);
    struct LNode *s=Locate(head,i-1);
    s->next=p->next;
     //添加代码
    if(p->next!=NULL)
    return 1;
    else
    return -1;

}

//在第i个节点之后添加数据y,成功添加返回该节点的指针,否则返回空
struct LNode *InsertNodeAfter(struct LNode *head,int i,DataType y){
    struct LNode *p=Locate(head,i);
    struct LNode *s;
 if(p!=NULL){
       s=(LNode *) malloc(sizeof(LNode));//分配新节点的内存空间
       if(s==NULL) return NULL;
       s->data=y;
       s->next=p->next;  
       p->next=s;
    }
    return p;
//添加代码
}
/*在带头结点的单链表中,查找按指定值等于key的结点,如果找到返回该值顺序位置,否则返回-1  缺陷 ,修改*/
int LocateKey(LNode *pHead, DataType key){
         int n=0;
        LNode *p=pHead;
        while(p!=NULL){
              p=p->next;
              if(p->data==key)
                  return n+1;
              n++;
        }
        return -1;
}

/*在带头结点的单链表中,获取第i个节点的数据保存到y中,如果成功获取返回1,否则返回0*/
int  GetData(LNode *head, int i,DataType &y){
    struct LNode *p=Locate(head,i);
    y=p->data;
    //添加代码
    if(y!=NULL)
    return 1;
    else
    return 0;

}

//打印输出链表的每一个节点的数据值
void PrintList(LNode *pHead)
{
    int n=0;
    if(pHead==NULL) return;
    LNode *p=pHead->next;
    while(p!=NULL){
         printf("%d ",p->data);
         n++;
         p=p->next;    
    }
    printf("  length=%d\n",n);
}

int main(int argc, char* argv[])
{ //验证
    LNode *head=InitList(); //获取带头结点的单链表的头指针
    InsertNode(head,1,99);
    InsertNode(head,1,90);
    InsertNode(head,2,990);
//    DataType y;
    PrintList(head);
    int nn= LocateKey(head,99);
    DelNode(head,2);
    PrintList(head);
      return 0;
}

 

posted on 2016-03-26 20:13  ssangelia  阅读(106)  评论(0编辑  收藏  举报

导航