单链表的基本操作

来源:互联网 发布:韩国看视频软件 编辑:程序博客网 时间:2024/06/05 03:59

单链表的创建、尾插法插入、删除、查找、元素个数、打印单链表等操作



#include<stdio.h>

#include<stdlib.h>

#define OK 1

#define ERROR 0

#define OVERFLOW -1

#define TRUE 1

#define FLASE 0

 

typedef int Status;              

typedef int ElemType;            //Status、ElemType为整型的别名

typedef struct LNode{            //定义结构体类型的节点

       ElemTypedate;       //数据域  保存结点的值

       structLNode *next;  //指针域 

}LNode,*LinkList;        //结点的类型

 

LinkList LinkCreat(){         //尾插法建表

       intdate;

       LNode*head,*p,*q;

       head=p=(LNode*)malloc(sizeof(LNode));  //分配一个LNode类型的空间 并将其首地址存放在指针变量head(恒不变)和p中

       p->next=NULL;

      

       while(1){

              scanf("%d",&date);       //输入元素的值

              if(date==12580)break;   //出现12580时结束输入

              q=(LNode*)malloc(sizeof(LNode));   //分配一个LNode类型的空间 并将其地址存放在中间指针变量q中

              q->date=date;        //数据域赋值

              q->next=p->next;     //相当于q->next=NULL

              p->next=q;           //连接两个结点

              p=q;                //相当于p->next=NULL

       }

       return(head);          //返回头指针head

}

 

void printlist(LNode *L){     //打印链表  验证结果

       LNode*p;

       p=L->next;       //p指向第一个元素

       while(p!=NULL){      //遍历  打印链表

              printf("%d",p->date);

              p=p->next;

       }

}

 

Status ListInsert_L(LinkList &L){       //插入函数

       LinkListp,s;         

       ElemTypei,j,e;

       scanf("%d%d",&i,&e);    //在第i个元素位置插入e

       p=L;j=0;

       while(p&&j<i-1){       //寻找第i-1个结点

              p=p->next;

              ++j;

       }

       if(!p||j>i-1)returnERROR;    //i小于1或者大于表长加1

       s=(LinkList)malloc(sizeof(LNode));       //生成新结点

       s->date=e;s->next=p->next;          //将元素插入到L中

       p->next=s;

       printlist(L);           //打印链表  验证结果

       printf("\n");

}

 

Status ListDelete_L(LinkList &L){            //删除函数

       LinkListp,q;        //定义指针变量p、q

       ElemTypei,j;    

       scanf("%d",&i);      //删除第i个元素

       p=L;j=0;

       while(p->next&&j<i-1){        //寻找第i个元素  并使p指向其前趋

              p=p->next;

              ++j;

       }

       if(!p||j>i-1)returnERROR;         //删除位置不合理

       q=p->next;p->next=q->next;           //删除并释放结点

       free(q);

       printlist(L);

       printf("\n");

}

 

Status GetElem_L(LinkList L){         //查找第i个元素  存在则输出

       LinkListp;  

       ElemTypei,j,e;   

       scanf("%d",&i);

       p=L->next;j=0;         //p指向第一个元素 

       while(p&&j<i-1){      //寻找第i-1个结点

              p=p->next;

              ++j;

       }

       if(!p||j>i)returnERROR;       //第i个元素不存在

       e=p->date;             //取出第i个元素

       printf("%d\n",e);       //输出第i个元素

}

 

Status ListLength(LinkList L){     //返回链表长度

       LNode*p;

       Statusi=0;

       p=L->next;       //p指向第一个元素

       while(p!=NULL){      //遍历  计算出链表中元素的个数

              i++;

              p=p->next;

       }     

       returni;

}

 

void LocateElme(LinkList L){       

       LNode*p;

       Statuse;      //输出链表中比某个值相比较成功的元素序列号

       printf("标准数值为:");

       scanf("%d",&e);

       Statusi=1;

       p=L->next;        //p指向第一个元素

       while(p!=NULL){      //遍历 比较函数

              if(p->date>=e){

                     p=p->next;

                     i++;

              }

              else

                     break;       //找到这样的数  跳出循环

       }

       if(i>ListLength(L))

              printf("不存在这样的值!\n");

       else{

              printf("符合条件的元素位序为:\n") ;

              printf("%d\n",i);

       }                 

}

 

int main(){          //主函数

       LinkListL;

       printf("请输入链表元素(出现12580时结束):\n");

       L=LinkCreat();          //输入链表元素

       printf("此链表的元素个数为:\n");

       printf("%d\n",ListLength(L));        //输出链表中元素的个数

       printf("输出链表中第一次出现比标准数小的序列号:\n");

       LocateElme(L);                //输出简单的比较函数

       printf("请输入插入元素的序列号和值:\n");

       ListInsert_L(L);       //链表插入函数

       printf("请输入要删除元素的序列号:\n");

       ListDelete_L(L);          //链表删除函数

       printf("请输入要查找元素的序列号:\n");

       GetElem_L(L);          //链表查找函数

       return0;

}

原创粉丝点击