C语言 线性表的创建,遍历等

本文深入探讨了使用C语言实现顺序表的各种操作,包括初始化、遍历、元素插入及归并等。通过具体代码示例,展示了如何有效管理顺序表的存储结构,以及如何在不破坏原有数据的情况下进行元素的插入和两个已排序顺序表的归并。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <malloc.h>
#include <process.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define INITSIZE 100
#define INCREMENT 10 //预定义常量
typedef int Status;  //定义状态结果类型
typedef int ElemType;  //定义数据元素类型
typedef struct {
 ElemType *elem;
 int length;
 int listsize;
}SqList;  //定义顺序表的存储结构

Status InitList(SqList &L)
{//构造一个空的顺序表L.
  L.elem=(ElemType*)malloc(INITSIZE*sizeof(ElemType));
  if(!L.elem)exit(OVERFLOW);
  L.length=0;
  L.listsize=INITSIZE;
  return(OK);
}

void Assign(SqList &L)
{ //为顺序表L的各元素赋值.
  int i, N;
  printf("Please input the Number of the SqList:");
  scanf("%d",&N);
  printf("Please input the elements:");
  for(i=0;i<N;i++)
  { scanf("%d",&L.elem[i]);
  L.length++;}
 }

void ListTraverse(SqList L)
{//遍历顺序表L.
  int i;
  for(i=0;i<=L.length-1;i++)
  printf("%d    ",L.elem[i]);
  printf("\n");
  printf("the length is:%d\n",L.length);
 }

void Print(ElemType g)
{
 printf("%d\n",g);
}
void ListTraverse2(SqList L,void (*vi)(ElemType))
{//遍历顺序表L的另一种方法.
  int i;
  ElemType *p;
  p=L.elem;
  for (i=0;i<=L.length-1;i++)
 vi(*p++);
    printf("the length is:%d\n",L.length);
}

Status GetELem(SqList L, int i, ElemType &e)
{//取顺序表L的第i个元素的值,用e返回.
  e=L.elem[i-1];
  return OK;
}

int ListLength(SqList L)
{ //求顺序表的长度 
  return(L.length);
}

Status ListInsert(SqList &L, int i, ElemType e)
{ //在顺序表L的第i个元素前插入元素e.
  ElemType *p,*q,*newbase;
  if(i<1||i>L.length+1)return ERROR;
  if(L.length==L.listsize)
  {
 newbase=(ElemType*)realloc(L.elem,(INITSIZE+INCREMENT)*sizeof(ElemType));
    if(!newbase)exit(OVERFLOW);
    L.elem=newbase;
 L.listsize+=INCREMENT;
  }
  q=&L.elem[i-1];
  for(p=&L.elem[L.length-1];p>=q;--p)
   *(p+1)=*p;
  *q=e;
  ++L.length;
  return OK;
}

void MergeList(SqList La,SqList Lb, SqList &Lc)
{ //已知顺序表La和Lb的元素按值非递减排列,
  //归并La和Lb得到新的顺序表Lc,Lc的元素也按值非递减排列.
  ElemType *pa,*pb,*pc,*pa_last,*pb_last;
  pa=La.elem;
  pb=Lb.elem;
  Lc.listsize=Lc.length=La.length+Lb.length;
  pc=Lc.elem=(ElemType*)malloc(Lc.listsize*sizeof(ElemType));
  if(!Lc.elem)exit(OVERFLOW);
  pa_last=La.elem+La.length-1;
  pb_last=Lb.elem+Lb.length-1;
  while(pa<=pa_last&&pb<=pb_last)
  {
 if(*pa<=*pb) *pc++=*pa++;
 else *pc++=*pb++;
  }
  while(pa<=pa_last) *pc++=*pa++;
  while(pb<=pb_last) *pc++=*pb++;
}

int main()
{   SqList L,L1,L2;
    int i,j;
 ElemType e,f;
    if(InitList(L)) printf("Init success\n");  //初始化顺序表L
 Assign(L);                        //为L的元素赋值
 ListTraverse(L);                    //遍历顺序表L
 //ListTraverse2(L,Print);
 printf("Plsese input the location i:");
 scanf("%d",&i);
 GetELem(L,i,e);                      //取顺序表的第i 个元素,赋给e
 printf("The ith elem is: %d\n",e);
 printf("Please input the Inserted elem's No. and the value:");
 scanf("%d  %d",&j,&f);
 ListInsert(L,j,f);                      //在L的第i个位置之前插入f
 ListTraverse(L);
 InitList(L1);                          //初始化顺序表L1
 Assign(L1);                           //为L1的元素赋值
 ListTraverse(L1);                       //遍历顺序表L1
 MergeList(L,L1,L2);                    //归并顺序表L,L1,得到L2
 ListTraverse(L2);                       //遍历顺序表L2
 return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值