• 链表的创建和操作


    //链式结构
    #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;
    }

  • 相关阅读:
    约瑟夫环问题(Joseph)
    Java变量及运算符
    浅谈 Hooks
    如何使用DBUtils
    mac webstrom 安装less
    字符流-缓冲区-自定义myBufferedReader
    跨平台换行符
    329.-io流(字符-练习-复制文本文件二)
    328.io流(字符串-练习-复制文本文件一)
    LockDemo 锁对象
  • 原文地址:https://www.cnblogs.com/java20130723/p/3211569.html
Copyright © 2020-2023  润新知