用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

}

}

}

#include<stdio.h>

#include<stdlib.h>

#define LIST_INIT_SIZE 100

#define LISTINCREMENT 10

typedef int status

typedef int ElemType

typedef struct{

ElemType *elem

int length,listsize

}SqList

status InitList(SqList &L)//初始化

{

L.elem=(int *)malloc(100*sizeof(int))

if(!L.elem) exit(-2)

L.listsize=100

L.length=0

return 1

}

/*先建立新表埋汪*/

status Build(SqList &L)

{

int i,n

printf("请输入元素个数闹液槐n和n个元素\n")

scanf("%d",&n)

//if(n>LIST_INIT_SIZE)

for(i=0i<ni++)

scanf("%d",L.elem+i)

L.length=n

return 1

}

/*输液友出表中元素和长度*/

void Print(SqList &L)

{

int i

for(i=0i<L.lengthi++)

printf("%d ",*(L.elem+i))

printf("\n长度为:%d\n\n",L.length)

}

/*删除值为X的元素*/

status ListDelete1(SqList &L,int x)

{

int i

for(i=0i<L.lengthi++)

if(*(L.elem+i)==x)

break

if(i==L.length)

return 0

for(i++i<L.lengthi++)

*(L.elem+i-1)=*(L.elem+i)

L.length--

return 1

}

/*逆置函数*/

void Inverse(SqList &L)

{

int i,t

for(i=0i<L.length/2i++)

{

t=*(L.elem+i)

*(L.elem+i)=*(L.elem+L.length-i-1)

*(L.elem+L.length-i-1)=t

}

printf("表逆置成功!!!\n")

}

/*(升序)*/

void Sort(SqList &L)

{

int i,j,t

for(i=1i<L.lengthi++)

for(j=0j<L.length-ij++)

{

if(*(L.elem+j)>*(L.elem+j+1))

{

t=*(L.elem+j)

*(L.elem+j)=*(L.elem+j+1)

*(L.elem+j+1)=t

}

}

printf("已升序\n")

}

/*合并两个线性表*/

status Merger(SqList &L,SqList &Lb)

{

int i,j,k

SqList Lc

InitList(Lc)

if(Lc.listsize<L.length+Lb.length)

{

Lc.elem=(ElemType *)realloc(Lc.elem,(L.length+Lb.length+LISTINCREMENT)*sizeof(ElemType))

if(!L.elem) exit(-2)

Lc.listsize=L.length+Lb.length+LISTINCREMENT

}

i=j=k=0

while(i<L.length &&j<Lb.length)

{

if(*(L.elem+i) <*(Lb.elem+j))

{

*(Lc.elem+k)=*(L.elem+i)

k++i++

}

else

{

*(Lc.elem+k)=*(Lb.elem+j)

k++j++

}

}

while(i<L.length)

{

*(Lc.elem+k)=*(L.elem+i)

k++i++

}

while(j<Lb.length)

{

*(Lc.elem+k)=*(Lb.elem+j)

k++j++

}

Lc.length=L.length+Lb.length

L=Lc

return 1

}

/*将X插入,使仍然有序*/

status ListInsert(SqList &L,int x)

{

int i,k

if(L.length>=L.listsize)

{

L.elem=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType))

if(!L.elem) exit(-2)

L.listsize+=LISTINCREMENT

}

for(i=0i<L.lengthi++)

if(x<*(L.elem+i))

break

k=i

for(i=L.lengthi>ki--)

*(L.elem+i)=*(L.elem+i-1)

*(L.elem+k)=x

L.length++

return 1

}

/*提示函数*/

void Tips()

{

printf("请选择你的想要的 *** 作:\n")

printf("<1>输出顺序表及顺序表的长度\n")

printf("<2>删除值为x的结点\n")

printf("<3>将顺序表逆置\n")

printf("<4>将顺序表按升序排序\n")

printf("<5>将x插入到顺序表的适当位置上\n")

printf("<6>将两个有序表合并\n")

printf("<0>退出\n\n")

}

int main()

{

SqList L,Lb

InitList(L)

Build(L)

int a,x,flag

//SqList L,Lb

Tips()

scanf("%d",&a)

while(a)

{

switch(a)

{

case 1:

{ Print(L)

break}

case 2:

{ printf("请输入要删除的数据X:\n")

scanf("%d",&x)

flag=ListDelete1(L,x)

if(flag)

printf("删除成功!!\n\n")

else

printf("元素不存在,删除失败!!\n\n")

break}

case 3:

Inverse(L)

break

case 4:

Sort(L)

break

case 5:

printf("请输入要插入的数据X:\n")

scanf("%d",&x)

flag=ListInsert(L,x)

if(flag)

printf("插入成功!!\n\n")

else

printf("插入失败!!\n\n")

break

case 6:

printf("请输入Lb的内容:\n")

InitList(Lb)

Build(Lb)

flag=Merger(L,Lb)

if(flag)

printf("合并成功!!\n\n")

break

//default

Tips()

scanf("%d",&a)

}

}

return 0

}


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

原文地址: https://outofmemory.cn/yw/12301561.html

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

发表评论

登录后才能评论

评论列表(0条)

保存