zoukankan      html  css  js  c++  java
  • 数据结构笔记5带头结点单链表

    /*
     本次操作是对带头节点单链表的操作  包括删除  插入 判空 建立 
     包括删除插入函数  显示函数
     目的是为了对单链表做一个基本操作的总结----1
    */ 
    #include<stdio.h>
    #include<malloc.h>
    #include<conio.h>
    #define OK 1
    #define ERROR -1
    #define OVERFLOW -2
    #define ENDFLAG 0
    typedef struct LNode{
     int data;
     struct LNode *next;
    }LNode,*LinkList;//定义链表结点 
    //初始化链表
    int InitSqList(LinkList *head){
     *head=(LinkList)malloc(sizeof(LNode));//定义头结点 
     if(NULL==*head)
      exit(ERROR);//-1  初始化失败 
     (*head)->next=NULL;//初始化成功
      return OK;//1 
    }
    //判空
    int ListEmpty(LinkList head){
     if(NULL==head->next)
      return OK;
     return ENDFLAG;//不为空 

    //输入即赋值头插法 
    int Create_List_Head(LinkList head,int n){
     int i;
     LNode *p=NULL;
     int temp;
     if(n<=0)
      return ERROR;//参数不合法,创建失败 -1
     for(i=n;i>=1;i--){
      p=(LNode *)malloc(sizeof(LNode));
      if(NULL==p)
       return OVERFLOW;//-2内存分配失败导致创建失败 
      printf("请输入你的%d个数据: ",i);
      scanf("%d",&temp);
      p->data=temp;
      p->next=head->next;//原首元节点成为新节点的直接后继 
      head->next=p;//新节点成为首元结点 
     } 
     return OK;//1

    /*
    //尾插法插入
    int Create_List_Tail(LinkList head,int n){
     int i,temp;
     LNode *p=NULL,*q=head;//辅助指针q始终指向表尾 
     if(n<=0)
      return ERROR;//-1
     for(i=1;i<n;i++){
      p=(LNode *)malloc(sizeof(LNode));
      if(NULL==p)
       return OVERFLOW;//-2
      printf("请输入你的%d个数据: ",i);
      scanf("%d",&temp);
      p->data=temp;
      p->next=NULL;
      q->next=p;//将新的节点插入到表尾 
      q=p;//辅助指针q指向新的表尾 
     }
     return OK;//创建成功 

    */
    //求长度
    int LinkList_Length(LinkList head){
     int len=0;
     LNode *p=head->next;
     while(NULL!=p){
      len++;p=p->next;
     }
     return len;

    //查找数据元素的位置 
    int LocateElem(LinkList head,int e){
     int count=1;
     LNode *p=head->next;
     while(NULL!=p&&p->data!=e){
      p=p->next;count++;
     }
     if(NULL==p)
      return ENDFLAG;//0
     return count;

    //插入 
    int ListInsert(LinkList head,int i,int e){
     int count=0;//count 始终为p节点的位序
     LNode *p=head,*q=NULL;
     while(count<i+1&&NULL!=p){//寻找第i-1个结点
      p=p->next;count++; 
     } 
     if(count>i-1||NULL==p)
      return ERROR;//-1
     q=(LNode *)malloc(sizeof(LNode));
     if(NULL==q)
      return OVERFLOW;//-2 因为存储分配失败导致插入操作失败
     q->data=e;
     q->next=p->next;
     p->next=q;
     return OK;//1 
     //插入成功 
    }
    //删除 
    int DeletLinkList(LinkList head,int i,int *e){
     int count=0;//count始终为P结点的位序
     LNode *p=head,*q=NULL;
     if(1==ListEmpty(head))//判空 
      return ERROR;//-1
     while(count<i-1&&NULL!=p){//找第i-1个结点,并保证第i个结点存在 
      p=p->next;count++;
     }
     if(count>i-1||NULL==p)
      return OVERFLOW;//-2
     q=p->next;//让指针q指向要删除的第i个结点 
     *e=p->data;
     p->next=q->next;//删除 
     free(p);//释放空间
     return ENDFLAG;//0
     //删除成功 

    //显示
    int ShowLinkList(LinkList head){
     LNode *p=head->next;
     while(NULL!=p){
      printf("%d",p->data);
      p=p->next;
     }
     printf(" ");

    int main(){
     LinkList L;
     int i,e,l;
     if(!InitSqList(&L)){
      printf("初始化失败,按任意键退出:");
      getch();
      exit(0);
     }
     if(!Create_List_Head){
      printf("赋值失败按任意键退出:");
      getch();
      exit(0);
     } 
     ShowLinkList(L);
     printf("是否执行插入操作?1-是");
     int j,k;
     scanf("%d",&j);
     if(j==1)
      goto insert;
     else
      goto delet;
     insert:
      printf("请输入你要插入的位置: ");
      scanf("%d",&i);
      printf("请输入你要插入的数: ");
      scanf("%d",&e);
      if(!ListInsert(&L,i,e)){
       printf("插入失败按任意键退出:");
       getch();
       exit(0);
      }
      ShowLinkList(L);
     delet: 
      printf(" 是否实现删除操作?1-是");
      scanf("%d",&k);
      if(k==1)
       goto yes;
      else
       exit(0);
      yes:
       printf("请输入你要删除的数的位置: ");
       scanf("%d",&l);
       if(!DeletLinkList(&L,l)){
        printf("删除失败按任意键退出: ");
        getch();
        exit(0);
       }
       ShowLinkList(L);
     printf("链表基本操作测试已经结束,按任意键退出: ");
     getch();
     return 0;
    }

  • 相关阅读:
    字串变换
    单词接龙
    二叉搜索树
    搜索专题(未完)
    单调栈
    单调队列练习(切蛋糕&好消息,坏消息)
    队列专题
    滑动窗口/【模板】单调队列
    Linux下如何查看硬件信息?
    Git 居然可以用来跟女神聊天?
  • 原文地址:https://www.cnblogs.com/100114jerro/p/4998741.html
Copyright © 2011-2022 走看看