zoukankan      html  css  js  c++  java
  • 链表的创建和操作

    //链式结构
    #include <stdio.h>
    #include<stdlib.h>
    #include <malloc.h>

    #define MAXSIZE 1000

    typedef char ElemType;

    typedef struct LNode{//定义单链表结点类型
     ElemType data;
     struct LNode *next;
    }LinkList;

    void InitList(LinkList *&L){//带头结点的单链表
     L = (LinkList *)malloc(sizeof(LinkList));
     L -> next = NULL;
    }

    void DestroyList(LinkList *&L){
     LinkList *p = L,*q = p -> next;
     while(q != NULL){
      free(p);
      p = q;
      q = p -> next;
     }
     free(p);
    }

    int ListEmpty(LinkList *L){
     return(L -> next == NULL);
    }

    int ListLength(LinkList *L){
     LinkList *p = L;int i = 0;
     while(p -> next != NULL){
      i++;
      p = p -> next;
     }
     return(i);
    }

    void DispList(LinkList *L){
     LinkList *p = L -> next;
     while (p != NULL){
      printf("%c",p -> data);
      p = p -> next;
     }
     printf("\n");
    }

    int GetElem(LinkList *L,int i,ElemType &e){
     int j = 0;
     LinkList *p =L;
     while(j < i && p != NULL){
      j++;
      p = p -> next;
     }
     if (p == NULL)
      return 0;
     else {
      e = p -> data;
      return 1;
     }
    }

    int LocateElem(LinkList *L,ElemType e){
     LinkList *p = L -> next;
     int n = 1;
     while(p != NULL && p -> data != e){
      p = p -> next;
      n++;
     }
     if(p == NULL)
      return(0);
     else
      return(n);
    }

    int ListInsert(LinkList *&L,int i,ElemType e){
     int j = 0;
     LinkList *p = L,*s;
     while (j < i-1 && p != NULL){
      j++;
      p = p -> next;
     }
     if(p == NULL)//未找到第i-1个结点
      return 0;
     else  //找到第i-1个结点*p
     {
      s = (LinkList *)malloc(sizeof(LinkList));//创建新结点*s
      s -> data = e;
      s -> next = p -> next;    //将*s插入到*p之后
      p -> next = s;
      return 1;
     }
    }

    int ListReplace(LinkList *&L,int i,ElemType e){//替换
     int j = 0;
     LinkList *p = L;
     while(j < i && p != NULL){
      j++;
      p = p -> next;
     }
     if (p == NULL)//未找到第i-1个结点*p
      return 0;
     else{  //找到第i-1个结点
      p -> data = e;
      return 1;
     }
    }

    int ListDelete(LinkList *&L,int i,ElemType &e){
     int j = 0;
     LinkList *p = L,*q;
     while(j < i-1 && p != NULL){
      j++;
      p = p -> next;
     }
     if (p == NULL)  //未找到第i-1个结点
      return 0;
     else{    //找到第i-1个结点*p
      q = p -> next;  //q指向要删除的结点
      if(q == NULL) return 0;
      e = q -> data;
      p -> next = q -> next;//从单链表中删除*q结点
      free(q);   //释放*q结点
      return 1;
     }
    }


    void showmenu(){
     
     printf("\n\n\n");
     printf("  --线性表的基本运算--   \n");
     printf("********************************************\n");
     printf("* 1-----插入一个新元素到第i个位置    *\n");
     printf("* 2-----删除第i个位置的元素    *\n");
     printf("* 3-----存一个新元素到第i个位置    *\n");
     printf("* 4-----显示链表中的所有元素值    *\n");
     printf("* 5-----检索表中第i个元素     *\n");
     printf("* 6-----求表的长度     *\n");
     printf("*        *\n");
     printf("* 0-----退出      *\n");
     printf("********************************************\n");
     printf("请选择菜单号(0--6):");
    }

    void clear()      //自动清屏
    {
     system("pause");
     system("cls");
    }

    void Charu()
    {
     char choice = 'N';
     ElemType item;
     int Position;

     LinkList *L;
     InitList(L); //创建一个顺序表
     printf("请输入一个新元素的值:");
       flushall();
       scanf("%c",&item);
       printf("请输入插入的位置:");
       scanf("%d",&Position);
       if (ListInsert(L,Position,item)){
        printf("插入成功! \n");
       }
       else{
        printf("插入失败!请检查输入位序号是否正确\n");
       }
    }

    void Shanchu()
    {
     char choice = 'N';
     ElemType item;
     int Position;

     LinkList *L;
     InitList(L); //创建一个顺序表
     printf("请输入要删除元素的位置序号:");
       scanf("%d",&Position);
       if(ListDelete(L,Position,item)){
        printf("删除的元素为 %c \n",item);
       }
       else{
        printf("删除失败! 请减产输入位序号是否正确 \n");
       }
    }
    void Xiugai()
    {
     char choice = 'N';
     ElemType item;
     int Position;

     LinkList *L;
     InitList(L); //创建一个顺序表

     printf("请输入一个新元素的值");
       flushall();
       scanf("%c",&item);
       printf("请输入该元素的存放位置:");
       scanf("%d",&Position);
       if (ListReplace(L,Position,item)){
        printf("操作成功! \n");
       }
       else{
        printf("操作失败! 请检查输入位序号是否正确\n");
       }
    }

    void Jiansuo()
    {
     char choice = 'N';
     ElemType item;
     int Position;

     LinkList *L;
     InitList(L); //创建一个顺序表
     printf("请输入元素为序号:");
       scanf("%d",&Position);
       if(GetElem(L,Position,item)){
        printf("第%d个元素为:%c\n",Position,item);
       }
       else{
        printf("输入的位序号错误! \n");
       }
    }
    void LineOP2(){
     char choice = 'N';
     ElemType item;
     int Position;

     LinkList *L;
     InitList(L); //创建一个顺序表

     while(choice != '0'){
      showmenu();
      flushall();
      scanf("%c",&choice);
      switch(choice){
      case '1':
       Charu();
       clear();
       break;

      case '2':
       Shanchu();
       clear();
       break;

      case '3':
       Xiugai();
       clear();
       break;

      case '4':
       DispList(L);
       break;

      case '5':
       Jiansuo();
       clear();
       break;

      case '6':
       printf("线性表的长度为%d\n",ListLength(L));
       break;

      case '0':
       printf("\n\t程序结束! \n");
       DestroyList(L);
       break;

      default:
       printf("\n\t选择错误,请重新输入!\n");
       break;
      }
     }
    }

    int main(){
     LineOP2();
     return 0;
    }

  • 相关阅读:
    How to create jar for Android Library Project
    Very large tabs in eclipse panes on Ubuntu
    64bit Ubuntu, Android AAPT, R.java
    Linux(Ubuntu)下如何安装JDK
    Configure xterm Fonts and Colors for Your Eyeball
    建立、配置和使用Activity——启动其他Activity并返回结果
    建立、配置和使用Activity——使用Bundle在Activity之间交换数据
    建立、配置和使用Activity——启动、关闭Activity
    建立、配置和使用Activity——Activity
    异步任务(AsyncTask)
  • 原文地址:https://www.cnblogs.com/java20130723/p/3211569.html
Copyright © 2011-2022 走看看