数据结构用c实现线性表子系统

来源:互联网 发布:阿里员工开除 知乎 编辑:程序博客网 时间:2024/05/22 05:40

老师课堂上布置的任务,然后 莫名的感觉老师高估我们的水平了

这程序我真的不会自己编,所以百度到两组关于线性表子系统的代码

我也不知道为什么会莫名的想传到博客上
反正 反正我心情好 我乐意

-------------------------------------我是萌萌哒的分割线-------------------------------------

第一组代码

#include<stdio.h>
#include<stdlib.h>//因为使用malloc动态空间
#define N sizeof(node)

//  结点定义
typedef struct linknode
{
    char data;
    struct linknode * next;
}node,*linklist;

node *head;   // 定义一个全局头指针

//建表并且输入内容,结束标记位‘#
void InputList()
{
    node *r,*s;
    char x;
    int T=1,n=0;
    head=(node*)malloc(N);
    r=head;
    printf("\n\t建立一个线性表");
    printf("\n\t请逐个输入字符,结束标记位‘#’\n");
    while(T)
    {
        printf("\t\t请输入:");
        fflush(stdin);//===============为什么必须加上  scanf("%c",&x);才不会出现    ”两遍的  请输入:  请输入:“
        /*清除标准输入设备(一般是键盘)的缓存。往往适用于截获输入特殊值,例如每次读取一个输入的字符,
        但是如果你输完一个字符后敲了回车,回车是一个特殊的键,会产生2个字符,因此程序会认为你输入了3个字符,
        此时可以用读取一个字符后用这个函数清除键盘缓存,从而清除回车的影响。*/
        scanf("%c",&x);
        if(x!='#')
        {
            s=(node*)malloc(T);
            n++;
            s->data=x;
            r->next=s;
            s->next=NULL;
            r=s;
        }
        else T=0;
    }
    //printf("\n请输入所要达到第几号功能:\t");
}

//输出链表中各个结点
void ShowList()
{
    node *p;
    p=head->next;
    printf("表中内容为:\t");
    while(p!=NULL)
    {
        printf("%c",p->data);
        p=p->next;
    }
    //printf("\n请输入所要达到第几号功能:\t");
}

//查询链表中的某个元素(当“插入数据“或者“删除数据”时函数调用的函数)
node *FindList_number(int i)
{
    int j=0;
    node *p;
    p=head->next;
    while((p->next)!=NULL&&(j<i))
    {
        p=p->next;
        j++;
    }
    if(j==i)
        return p;
    else printf("输入数据错误!!!");
}

//查找链表中的某一个元素
void FindList()
{
    char x;
    int i=1;
    node *p;
    printf("\t\t请输入所要查询的元素x:\t");
    //x=getchar();
    //getchar();
    fflush(stdin);
    scanf("%c",&x);

    if(head==NULL)
        printf("\t该链表只有头指针!!");
    if(head->next==NULL)
        printf("\t该线性表为空!\n");
    p=head->next;
    while(p!=NULL&&(p->data!=x))
    {
        p=p->next;
        i++;
    }
    if(p!=NULL)
    {
        printf("\t\t在链表的第 %d 位找到 x = %c \n",i,x);
    }

    else printf("\t\t在该线性表中没有找到‘X’!\n");
    //printf("请输入所要达到第几号功能:\t");
}

//插入一个元素,在链表中“某个元素”“之前”插入
void InsertList_befor()
{
    char x;
    //int y;
    int i=0;
    node *p,*s;
    printf("请输入所要插入的第 i 位元素后 i=\t");
    fflush(stdin);
    scanf("%d",&i);
    printf("请输入第 i 位后,所要插入的X的值X=\t");
    fflush(stdin);
    x=getchar();
    p=FindList_number(i-1);
    s=(node*)malloc(N);
    s->data=x;
    s->next=p->next;
    p->next=s;
    //y=s->data;
    //s->data=p->data;
    //p=s;
}

//求表长,求链表的长度函数
void LengthList()
{
    int len=1;
    node *p;
    p=head->next;
    while(p->next!=NULL)
    {
        p=p->next;
        len++;
    }
    printf("该线性表的长度:  len= %d \n",len);
}

//删除, 在该线性表链式结构中删除某个元素
void DeleteList()
{
    node *p,*q;
    char x;
    printf("请输入所要删除的元素x: \t");
    fflush(stdin);
    scanf("%c",&x);
    if(head==NULL)
    {
        printf("\t该链表的头指针为空!!!\n");
        return;
    }
    if(head->next==NULL)
    {
        printf("\t该链表为空表!!!\n");
    }
    q=head;
    p=head->next;
    while((p!=NULL)&&(p->data!=x))
    {
        q=p;
        p=p->next;
    }
    if(p!=NULL)
    {
        q->next=p->next;
        free(p);
        printf("\t\t线性表中的x= %c 已被删除\n",x);
    }
    else
        printf("\t未找到所要删除的元素!!\n");
}


int main()//  显示菜单函数
{
    char m;
    while(1)
    {
        printf("                              线性表子系统\n");
        printf("            ***************************************************\n");
        printf("            *               1------建    表                   *\n");
        printf("            *               2------插    入                   *\n");
        printf("            *               3------删    除                   *\n");
        printf("            *               4------显    示                   *\n");
        printf("            *               5------查    找                   *\n");
        printf("            *               6------求 表 长                   *\n");
        printf("            *               0------返    回                   *\n");
        printf("            ***************************************************\n");
        printf("            请输入(0-6)选项:\n");
        printf("\n请输入所要达到第几号功能:\t");
        fflush(stdin);
        scanf("%c",&m);
        if(m == '1')
            InputList();
        else if(m == '2')
            InsertList_befor();
        else if(m == '3')
            DeleteList();
        else if(m == '4')
            ShowList();
        else if(m == '5')
            FindList();
        else if(m == '6')
            LengthList();
        else if(m == '0')
            return 0;
        else{
            printf("输入有误,请重新输入\n");
        }
    }

    return 0;
}

--------------------------------我是萌萌哒的分割线-------------------------------------

第二组代码

#include<stdio.h>
#include<malloc.h>

typedef struct linknode   // 结点类型定义
 {
   char data;            // 数据域,数据类型为字符型
   struct linknode *next;    // next为指针域
  }linknode;

  linknode *head;        // 定义 head 为结构类型指针变量
  int n;        //n为线性表的长度


  //尾插法建表
  // 带头结点的尾插法建立单链表
  void createlist()
  {
        char x;
        int z=1;
        linknode *p,*s;
        n=0;         //线性表的长度刚开始为0

        head=(linknode *)malloc(sizeof(linknode));  // 生成头结点
        p=head;         //尾指针初值指向头结点

        printf("\n\t\t请逐个输入结点。以x位结束标记!\n");
        while(z)
        {
              printf("\n\t\t请输入一个字符数据,并按回车:\n");
              scanf("\n%c",&x);
              if(x!='x')   // ‘x’为输入结束符
              {
                  s=(linknode *)malloc(sizeof(linknode));  // 生成新结点
                  n++;                  //表长加1
                  s->data=x;
                  p->next=s;         // 新结点插入表尾
                  s->next=NULL;
                  p=s;               // 尾指针 p 指向新的表尾
              }
              else
              {
                  z=0;       //遇x结束链表循环
              }

        }
  }


  //插入结点算法
  void insertList(int i, char x)  //i 的合法位置为:1<=i<=n
  {
     linknode *s,*p;
     int j=0;   //j用来计数
     p=head;

     printf("\t\t请输入要插的位置和数值<i x>,并按回车:\n");
     scanf("\n%d %c",&i,&x);
    if(i>0)
     {
         while(p!=NULL && j<i-1)   //在结点范围内并且当j<i-1时循环执行
         {
              j++;
              p=p->next;   //后移指针
         }   //当j==i时循环结束

         if(p!=NULL)  //p还在结点范围内,肯定j==i,说明找到了
         {
              s=(linknode*)malloc(sizeof(linknode));  //生成新结点
              s->data=x;
              s->next=p->next;
              p->next=s;  //将新结点插在位置为i的结点p的后面
              n++;    //表的长度加1
              printf("\n\t\t插入成功");
         }else
         {
              printf("\n\t\t线性表为空或插入位置超界");
         }
     }else
     {
          printf("\n\t\t抱歉!插入位置错误,请重新插入!");
     }
  }






  //删除数据域为x的结点元素
  void deleteList(char x)
  {
      linknode *p,*q;
      q=head;
      p=head->next;   //q指向第一个元素
      printf("\n\t\t请输入要删除的数据元素:");
      scanf("\t\t%c",&x);

     while(p!=NULL && p->data!=x)
     {
        q=p;
         p=p->next;
    }            //顺链查找,直到p->data==x循环终止
    if (p!=NULL)
    {
        q->next=p->next;        // 如果p还在范围内,肯定p->data==x
        free(p);
        n--;   //表的长度减1
        printf("\n\t\t删除成功,结点%c已经被删除!",x);
    }
    else
         printf("\n\t\t抱歉!没有找到您要删除的结点\n");

 }

 //显示线性表
 void showlist()
 {
     linknode *p=head;
     printf("\n\t\t显示线性表的所有元素:\n\t\t");

       while(p->next!=NULL)    //链表不为空
        {
            printf("%5c",p->next->data);
               p=p->next;      //后移指针
        }

     if(head->next==NULL||p==NULL)
        printf("\n\t\t链表为空");
 }


 //按序号查找
 linknode *queryList1(linknode *head, int i)
     //  head接收已存在的链表的头指针
     //  i 接收要查找的结点的位置
     //从头结点开始顺链扫描
 {
     linknode *p;   //用指针 p 指向当前扫描到的结点。
     int j=1;       //用 j 作统计已扫描结点数的计数器,j 的初值为 1 。
     p=head->next;        //p 的初值指链表中的第一个元素.

     printf("\n\t\t请输入要查找的结点的位置,并按回车:\n");
     scanf("\n%d",&i);

     while( p->next!=NULL && j<i )
     {
         p=p->next;
         j++;           //当 p 扫描下一个结点时,j 自动加 1
     }
     if(j==i)          //当 j=i时,指针 p 所指的结点就是第 i 个结点
     {
           printf("\n\t\t查找的此结点所在位置的值为:%c",p->data);
     }

     else
     {
         printf("\n\t\t未找到此节点,请确认输入是否正确!!");
     }


 }


 void lengthList()
 {
     linknode *p;
     n=0;
     p=head;
     while(p->next!=NULL && p!=NULL)
     {
           n++;     //表的长度加1
           p=p->next;    //后移指针

     }
     if(p->next==NULL)      //如果到表尾
     {
           printf("\n\t\t线性表的长度为:%d",n);
     }else
     {
         printf("\n\t\t链表不存在");
     }


 }


 void main()
 {    int choose,i,j=1;
      char x;
      head = NULL;
     while(j)
     {
           printf("\n\t\t\t\t 线性表子系统");
           printf("\n\t\t*************************************************");
           printf("\n\t\t* \t         1------建 表 \t\t\t* ");
           printf("\n\t\t* \t         2------插 入 \t\t\t* ");
           printf("\n\t\t* \t         3------删 除 \t\t\t* ");
           printf("\n\t\t* \t         4------显 示 \t\t\t* ");
           printf("\n\t\t* \t         5------查 找 \t\t\t* ");
           printf("\n\t\t* \t         6------求 表 长 \t\t* ");
           printf("\n\t\t* \t         0------返 回 \t\t\t* ");
           printf("\n\t\t*************************************************");
           printf("\n\t\t请选择菜单号码(0-6):");
           scanf("%d",&choose);
           printf("\n");
           if(choose==1)
           {
                createlist();
                printf("\n\t\t\t\t 建表成功!!!\n");
           }else if(choose==5)
           {
                  queryList1(head, i);
                 //queryList2(head, x);
           }else if(choose==2)
           {
                 insertList(i, x);
           }else if(choose==3)
           {
                  //deleteList(i);
                 deleteList(x);
           }else if(choose==4)
           {
               if(head==NULL)
               {
                   printf("\n\t\t抱歉!线性表为空,请先建表!");
               }else
               {
                   showlist();
               }
           }else if(choose==6)
           {
               lengthList();
           }else if(choose==0)
           {
               j=0;
           }else
           {
               printf("输入错误,请重新输入!");
           }
     }
 }
-----------------------------我依旧是萌萌哒的分割线----------------------------------

以上内容纯属转载,第一组代码原文详见2puT博客http://blog.csdn.net/lina_acm/article/details/51162501

第二组代码详见博客园竹立荷塘http://www.cnblogs.com/daipianpian/p/4514266.html



原创粉丝点击