巴戟天 发表于 2020-3-14 18:05

初学者 c语言数据结构线性表的基本操作及应用

#### 实验报告: 线性表的基本操作及应用

##### 实验内容
基本要求:
(1)实现单链表的创建;(2)实现单链表的插入;(3)实现单链表的删除
(4)实现单链表的查找;(5)实现单链表的显示;

```c
/*
    Name:Linklist operation.cpp
    Author:X
    Date:2020/3/13
    Description: 线性表的基本操作及应用
*/
#include<stdio.h>
#include<stdlib.h>   //分配数据
#define ERROR 0;
#define OK 1;

typedef int ElemType;
typedef int status;

typedef struct LNode
{
        ElemType data;
        struct LNode *next;
}LNode,*LinkList;

//建立线性表LA   ,头插法
status CreatList_LA(LinkList &LA,int n)
{
        LNode *p;int i;
        LA=(LinkList)malloc(sizeof(LNode));
        LA->next=NULL;
       
        for(i=n;i>0;--i)
        {
                p=(LinkList)malloc(sizeof(LNode));
                scanf("%d",&p->data);
                p->next=LA->next;
                LA->next=p;
        }
        return OK;       
}


//建立线性表LB
status CreakList_LB(LinkList &LB,int n)
{
        LNode *p;status i;
        LB=(LinkList)malloc(sizeof(LNode));
        LB->next=NULL;
       
        for(i=n;i>0;--i)
        {
                p=(LinkList)malloc(sizeof(LNode));
                scanf("%d",&p->data);
                p->next=LB->next;
                LB->next=p;
        }
        return OK;       
}

//在第i个结点前插入e
status ListInsert_LA(LinkList &LA,status i,ElemType e)
{
        LNode *p,*s;   //等同于 LinkList p,s;
        status j;
        p=LA;j=0;
        while(p&&j<i-1)
        {
                p=p->next;++j;   //计数器
        }
        if(!p||j>i-1)
        return ERROR;
        s=(LinkList)malloc(sizeof(LNode));
        s->data=e;
        s->next=p->next;
        p->next=s;
        return OK;
}

//删除第i个结点,值代入e
status ListDelete_LA(LinkList &LA,int i,ElemType &e)
{
    LNode *p,*q;
        status j;
        p=LA;j=0;
        while(p||j<i-1)
        {p=p->next;++j;}
        if(p->next==NULL||j>i-1)
    returnERROR;
    q=p->next;
    p->next=q->next;
    e=q->data;                                                               
    free(q);
    return OK;
}

//查找到第i个元素,用e返回
status GetElem_LA(LinkList LA,int i,ElemType e)
{   
    LNode *p;
        p=LA;
        status j;
        j=0;
        while(p&&j<i-1)
        {p=p->next;++j;}
        if(!p||j>i)
        return ERROR;
        e=p->data;
        return OK;
}

//合并线性表LA和LB
status MergeList_L(LinkList &LA,LinkList &LB,LinkList &LC)
{
        LNode *pa,*pb,*pc;
        pa=LA->next;
        pb=LB->next;
        LC=pc=LA;
        while(pa&&pb)
        {
                if(pa->data<=pb->data)
                {
                        pc->next=pa;
                        pc=pa;
                        pa->next;
                }
                else
                {
                        pc->next=pb;
                        pc=pb;
                        pb=pb->next;
                }
                pc->next=pa?pa:pb;
                               
        }
        free(LB);
       

}

//输出链表
status printfList_L(LinkList &L)
{
        LNode *p;
        int i;
        p=L->next;
    while(p)
    {
            printf("%d ",p->data);
            p=p->next;
        }
}

int main()
{
        ElemType e ;
        LinkList LA,LB,LC;
        status i,n;
        printf("输入向所创建LA链表中插入几个结点,n为:");
        scanf("%d",&n);
        printf("输入链表的结点数据:");
        CreatList_LA(LA,n) ;
       
        printf("输入向所创建LB链表中插入几个结点,n为:");
        scanf("%d",&n);
        printf("输入链表的结点数据:");
        CreakList_LB(LB,n);
       
    printf("输出链表LA为:");
        printfList_L(LA);
        printf("\n输出链表LB为:");
        printfList_L(LB);
       
        printf("\n输入在链表第几个位置插入结点,i,e为:");
        scanf("%d%d",&i,&e);
        ListInsert_LA(LA,i,e);
        printf("\n插入后使出的链表为:");
        printfList_L(LA);
       
        printf("\n输入在链表第几个位置删除结点,i为:");
    scanf("%d",&i);
    ListDelete_LA(LA,i,e);
    printf("\n删除后的链表LA为:");
    printfList_L(LA);
    printf("删除的第%d个结点所储存的元素为:%f",i,e);
   
    printf("\n输入想查找第几个元素结点,i为:");
    scanf("%d",&i);
    GetElem_LA(LA,i,e);
    printf("\n查找到的第i个元素为:");
    printf("%d",e);
   
    printf("\n合并之后的链表为:");
        MergeList_L(LA,LB,LC);
        printfList_L(LC);
       
        return OK;
}


```
【记得引用符&与变量名称间有空格】
【定义的函数数据类型要与其中数据的数据类型一值】

第一次发东西,主要是怕删号

0Ling0 发表于 2020-3-14 20:35

/*
    Name:Linklist operation.cpp
    Author:X
    Date:2020/3/13
    Description: 线性表的基本操作及应用
*/
#include<stdio.h>
#include<stdlib.h>   //分配数据
#define ERROR 0;
#define OK 1;

typedef int ElemType;
typedef int status;

typedef struct LNode
{
      ElemType data;
      struct LNode *next;
}LNode,*LinkList;

//建立线性表LA   ,头插法
status CreatList_LA(LinkList &LA,int n)
{
      LNode *p;int i;
      LA=(LinkList)malloc(sizeof(LNode));
      LA->next=NULL;
      
      for(i=n;i>0;--i)
      {
                p=(LinkList)malloc(sizeof(LNode));
                scanf("%d",&p->data);
                p->next=LA->next;
                LA->next=p;
      }
      return OK;      
}


//建立线性表LB
status CreakList_LB(LinkList &LB,int n)
{
      LNode *p;status i;
      LB=(LinkList)malloc(sizeof(LNode));
      LB->next=NULL;
      
      for(i=n;i>0;--i)
      {
                p=(LinkList)malloc(sizeof(LNode));
                scanf("%d",&p->data);
                p->next=LB->next;
                LB->next=p;
      }
      return OK;      
}

//在第i个结点前插入e
status ListInsert_LA(LinkList &LA,status i,ElemType e)
{
      LNode *p,*s;   //等同于 LinkList p,s;
      status j;
      p=LA;j=0;
      while(p&&j<i-1)
      {
                p=p->next;++j;   //计数器
      }
      if(!p||j>i-1)
      return ERROR;
      s=(LinkList)malloc(sizeof(LNode));
      s->data=e;
      s->next=p->next;
      p->next=s;
      return OK;
}

//删除第i个结点,值代入e
status ListDelete_LA(LinkList &LA,int i,ElemType &e)
{
    LNode *p,*q;
      status j;
      p=LA;j=0;
      while(p||j<i-1)
      {p=p->next;++j;}
      if(p->next==NULL||j>i-1)
    returnERROR;
    q=p->next;
    p->next=q->next;
    e=q->data;                                                               
    free(q);
    return OK;
}

//查找到第i个元素,用e返回
status GetElem_LA(LinkList LA,int i,ElemType e)
{   
    LNode *p;
      p=LA;
      status j;
      j=0;
      while(p&&j<i-1)
      {p=p->next;++j;}
      if(!p||j>i)
      return ERROR;
      e=p->data;
      return OK;
}

//合并线性表LA和LB
status MergeList_L(LinkList &LA,LinkList &LB,LinkList &LC)
{
      LNode *pa,*pb,*pc;
      pa=LA->next;
      pb=LB->next;
      LC=pc=LA;
      while(pa&&pb)
      {
                if(pa->data<=pb->data)
                {
                        pc->next=pa;
                        pc=pa;
                        pa->next;
                }
                else
                {
                        pc->next=pb;
                        pc=pb;
                        pb=pb->next;
                }
                pc->next=pa?pa:pb;
                              
      }
      free(LB);
      

}

//输出链表
status printfList_L(LinkList &L)
{
      LNode *p;
      int i;
      p=L->next;
    while(p)
    {
            printf("%d ",p->data);
            p=p->next;
      }
}

int main()
{
      ElemType e ;
      LinkList LA,LB,LC;
      status i,n;
      printf("输入向所创建LA链表中插入几个结点,n为:");
      scanf("%d",&n);
      printf("输入链表的结点数据:");
      CreatList_LA(LA,n) ;
      
      printf("输入向所创建LB链表中插入几个结点,n为:");
      scanf("%d",&n);
      printf("输入链表的结点数据:");
      CreakList_LB(LB,n);
      
    printf("输出链表LA为:");
      printfList_L(LA);
      printf("\n输出链表LB为:");
      printfList_L(LB);
         
      printf("\n输入在链表第几个位置插入结点,i,e为:");
      scanf("%d%d",&i,&e);
      ListInsert_LA(LA,i,e);
      printf("\n插入后使出的链表为:");
      printfList_L(LA);
      
      printf("\n输入在链表第几个位置删除结点,i为:");
    scanf("%d",&i);
    ListDelete_LA(LA,i,e);
    printf("\n删除后的链表LA为:");
    printfList_L(LA);
    printf("删除的第%d个结点所储存的元素为:%f",i,e);
   
    printf("\n输入想查找第几个元素结点,i为:");
    scanf("%d",&i);
    GetElem_LA(LA,i,e);
    printf("\n查找到的第i个元素为:");
    printf("%d",e);
   
    printf("\n合并之后的链表为:");
      MergeList_L(LA,LB,LC);
      printfList_L(LC);
      
      return OK;
}

huafeng 发表于 2020-3-14 18:50

支持一下~~~

巴戟天 发表于 2020-3-17 13:22

0Ling0 发表于 2020-3-14 20:35
/*
    Name:Linklist operation.cpp
    Author:X


诶,我没找到插入c语言的模块的地方呢,我再找找看哈哈哈

LJT1997 发表于 2020-3-27 01:07

牛逼,收藏了,刚好考试要要用到!

寻Nina的红狼 发表于 2020-3-27 13:17

楼主 有的东西啊 我自己在写诸如此类的代码,不是这里错就是那里错,折磨之王

巴戟天 发表于 2020-4-4 21:34

LJT1997 发表于 2020-3-27 01:07
牛逼,收藏了,刚好考试要要用到!

哈哈哈哈那还真是巧了,没想到第一次发就能被用到

啊哈啊 发表于 2020-5-1 16:55

宏定义那块的分号??

ConstantinChiae 发表于 2020-5-1 18:05

可以再多多练习一下STL
页: [1]
查看完整版本: 初学者 c语言数据结构线性表的基本操作及应用