用C语言编写一个有关顺序表的程序代码

用C语言编写一个有关顺序表的程序代码,第1张

#include <stdio.h>

#include <malloc.h>

#define MaxSize 50

typedef char ElemType

typedef struct

{

ElemType elem[MaxSize]

int length

}SqList

void InitList(SqList *L) /型尘* 初始化顺序表 */

{

L=(SqList *)malloc(sizeof(SqList))

L->length=0

}

void CreateListR(SqList *L,ElemType a[],int n) /*创建顺序表 */

{

int i

for(i=0i<ni++)

L=(SqList *)malloc(sizeof(SqList))

L->elem[i]=a[i]

L->length++

}

void DispList(SqList *L) /* 输出顺序表 */

{

int i

if(ListEmpty(L)) return

for(i=0i<L->lengthi++)

printf("%c",L->elem[i])

printf("\n")

}

int ListLength(SqList *L) /* 求顺序表的长度 */卜携禅

{

return(L->length)

}

int ListEmpty(SqList *L) /* 求顺序表是否为空 */

{

return(L->length==0)

}

int GetElem(SqList *L,int i,ElemType e) /*求顺序表中某个数据的元素值 */

{

if(i<1||i>L->length)

return 0

else

e=L->elem[i-1]

return 1

}

int LocateElem(SqList *L,ElemType e)/*按值查找元素*/

{

int i=0

while(i<L->length&&L->elem[i]!=e) i++

if(i>=L->length)

return 0

else

return i+1

}

int ListInsert(SqList *L,int i,ElemType e) /*按i位隐嫌置插入元素*/

{

int j

if(i<1||i>L->length+1)

return 0

i--

for (j=L->lengthj>ij--)

L->elem[j]=L->elem[j-1]

L->elem[i]=e

L->length++

return 1

}

int ListDelete(SqList *L,int i,ElemType e) /*删除某个位置的元素*/

{

int j

if (i<1||i>L->length)

return 0

i--

e=L->elem[i] /*e中的放elem[i]有何用..以后没用到*/

for(j=ij<L->length-1j++)

L->elem[j]=L->elem[j+1]

L->length--

return 1

}

void DestroyList(SqList *L) /*销毁链表*/

{

free(L)

}

void main()

{

SqList L

ElemType a[]={'a','b','c','d'}

int c

int e

while(1)

{

printf("Please Choose the step you want ?\n\n")

scanf("%d",&c)

if(c==0) break

switch(c)

{

case 1: InitList(&L)break

case 2: CreateListR(&L,a,4)break

case 3: DispList(&L)break

case 4: printf("long %d", ListLength(&L))break

case 5: printf("%d",ListEmpty(&L))break

case 6: GetElem(&L,3,e)break

case 7: LocateElem(&L,'a')break

case 8: ListInsert(&L,4,'f')break

case 9: DispList(&L)break

case 10: ListDelete(&L,3,e)break

case 11: DispList(&L)break

case 12: DestroyList(&L)break

default: printf("error data")break

}

}

}

/*

 *程序不足之处:1,main函数不应键型该为 void main

 *                        2,创建空的顺序表函数中 SqList L//定义顺序表L L是局部变量,

函数结束即销毁,应该用指针代替

 *                        3,SqList CreateList(SqList L)  //创建顺序表(非空)函数中:

scanf("%d",&L.elem)L里面的elem本来就是地址,

没必要 再加&符号,且每次输入都一直放在首地址,

    没达到程序所要表达的意思

 *                        4,void print(SqList L)  //输出当前顺序表 函数中:

printf("%-3d",L.elem)和上面是一样的道理

 *                        5,main函数中没有将申请的内存释放

 *现将程序稍作修改如下,望采纳

 */

#include<stdio.h>

#include<stdlib.h>

#define LIST_INIT_SIZE 100

#define Icreament 20

typedef int ElemType  //用户自定义数据元素类型

typedef struct

          ElemType *elem  //顺序表的基地址 

          int length  //顺序表的当前长度 

          int listsize  //预设空间容量

}SqList  //线性表的顺序存储结构

SqList* InitList()  //创建空的顺序表

           SqList* L = (SqList*)malloc(sizeof(SqList))//定义顺序表L

          if(!L)

         {

       塌掘       printf("空间划分失败,程序退出\n")  

              return NULL 

        }

       L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)) 

        if(!L->elem)

       {  

             printf("空间划分失败,程序退出\n")  

             return NULL 

      } 

       L->length=0 

        L->listsize=LIST_INIT_SIZE 

       return L

}

int CreateList(SqList* L)  //创建顺序表(非空)

          int number  //顺序表中元素的个数 

           int i  //循环变量 

            printf("请输入顺序表中元素的个数:") 

            scanf("%d",&number)

            if(number >LIST_INIT_SIZE)   团亮核//一定要判断输入的个数是否大于顺序表的最大长度

            {

                    printf("输入个数大于顺序表的长度\n")

                  return 0

             }

 for(i=0i<numberi++) 

        { 

               printf("输入第%d个数: ",i+1) 

               scanf("%d",L->elem+i)   //L->elem+i:每次的输入都保存在顺序表元素中的下一个地址,而不是一直放在元素的首地址

         }//给顺序表中每个数据元素赋值

        L->length=number  //当前顺序表的长度 

       return 1

}

void print(SqList* L)  //输出当前顺序表

{

          int i 

          for(i=0i<L->lengthi++)

         {

               printf("%-3d",*(L->elem + i)) //L->elem+i:和输入是一个道理

         } 

          printf("\n")

}

int main()

           SqList* L = InitList()  //申请一个指向顺序表的指针,并对其初始化

           if(!L)      //判断申请是否成功

          {

                printf("初始化线性表失败\n")

                return 1

           }

          if(!CreateList(L))   //判断创建顺序表是否成功

         {

               printf("创建顺序表失败\n")

             return 1

         }

            print(L)     //打印顺序表

         free(L->elem)    //释放申请的顺序表元素的内存

        free(L)     //释放申请的顺序表内存

          return 0

}

运行效果如图:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12296687.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存