线性表的操作,C语言

Python017

线性表的操作,C语言,第1张

#include"stdio.h"

#include<malloc.h>

typedef char ElemType

typedef struct LNode

{ElemType data

struct LNode *next

}LinkList

void CreatListF(LinkList *&L,ElemType a[],int n) //头插法建表

{

LinkList *sint i

L=(LinkList *)malloc(sizeof(LinkList))

L->next=NULL

for(i=0i<ni++)

{

s=(LinkList *)malloc(sizeof(LinkList))

s->data=a[i]

s->next=L->next

L->next=s

}

}

void CreateListR(LinkList *&L,ElemType a[],int n) //尾插法建表

{

LinkList *s,*rint i

L=(LinkList *)malloc(sizeof(LinkList))

r=L

for(i=0i<ni++)

{

s=(LinkList *)malloc(sizeof(LinkList))

s->data=a[i]

r->next=s

r=s

}

r->next=NULL

}

void InitList(LinkList *&L)//初始化线性表

{

L=(LinkList *)malloc(sizeof(LinkList))

L->next=NULL

}

void DestroyList(LinkList *&L) //销毁线性表

{

LinkList *p=L,*q=p->next

while(q!=NULL)

{

free(p)

p=q

q=p->next

}

free(p)

}

int ListEmpty(LinkList *L)//判断线性表是否为空

{

return(L->next==NULL)

}

int ListLength(LinkList *L)//求线性表的长度

{

LinkList *p=Lint n=0

while(p->next!=NULL)

{

n++p=p->next

}

return(n)

}

void DispList(LinkList *L) //输出线性表

{

LinkList *p=L->next

while(p!=NULL)

{

printf("%c",p->data)

p=p->next

}

}

int GetElem(LinkList *L,int i,ElemType &e) //求线性表中某个数据元素

{

int j=0

LinkList *p=L

while(j<i&&p!=NULL)

{

j++p=p->next

}

if(p==NULL)

return 0

else

{

e=p->datareturn 1

}

}

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

{

LinkList *p=L->next

int i=1

while(p!=NULL&&p->data!=e)

{

p=p->nexti++

}

if(p==NULL)return(0)

else return(i)

}

int ListInsert(LinkList *&L,int i,ElemType e) //插入数据元素

{

int j=0

LinkList *p=L,*s

while(j<i-1&&p!=NULL)

{

j++p=p->next

}

if(p==NULL)return 0

else

{

s=(LinkList *)malloc(sizeof(LinkList))

s->data=es->next=p->nextp->next=s

return 1

}

}

int ListDelete(LinkList *&L,int i,ElemType &e) //删除数据元素

{

int j=0

LinkList *p=L,*q

while(j<i-1&&p!=NULL)

{

j++p=p->next

}

if(p==NULL)

return 0

else

{

q=p->next

if(q==NULL)return 0

e=q->data

p->next=q->next

free(q)

return 1

}

}

int main()

{

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

LinkList *h

InitList(h) //初始化顺序表h

CreateListR(h,&a[0],5)//依次采用尾插入法插入a,b,c,d,e元素

printf("单链表为:")

DispList(h) printf("\n")//输出顺序表h

printf("该单链表的长度为:")

printf("%d",ListLength(h))printf("\n") //输出顺序表h的长度

if(ListEmpty(h)) printf("该单链表为空。\n")

else printf("该单链表不为空。\n") //判断顺序表h是否为空

GetElem(h,3,e)printf("该单链表的第3个元素为:")

printf("%c",e)printf("\n") //输出顺序表h的第3个元素

printf("该单链表中a的位置为:")

printf("%d",LocateElem(h,'a'))printf("\n") //输出元素'a'的位置

ListInsert(h,4,'f') //在第4个元素位置插入'f'素

printf("在第4 个元素位置上插入'f'后单链表为:")

DispList(h)printf("\n") //输出顺序表h

ListDelete(h,3,e) //删除L的第3个元素

printf("删除第3个元素后单链表为:")

DispList(h)printf("\n") //输出顺序表h

DestroyList(h)//释放顺序表h

return 0

}

//---------------------------------------------------------------------------

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define STY "%d"/*元素类型格式符*/

typedef int eltp/*元素类型*/

typedef struct node{

eltp data

struct node *next

} node

void init(void)

{

static int fg=1

if (fg) {

srand(time(NULL))

fg=0

}

}

node *insert(node *h,eltp d)

{

node *s=(node *)malloc(sizeof(node))

if (!h) {

s->data=d

s->next=NULL

h=s

}

else {

h->next=insert(h->next,d)

}

return h

}

node *create(int n)

{

node *h=NULL

int i

for (i = 0i<ni++) {

h=insert(h,rand()%100)

}

if (h) {

printf("线性表生成已完成!\n")

}

else {

fprintf(stderr,"线性表生成未成功\n")

exit(-1)

}

return h

}

node *del(node *h,eltp d)

{

node *p

if (h&&h->data==d) {

p=h

h=h->next

free(p)

}

else if (h) h->next=del(h->next,d)

return h

}

int search(node *h,eltp d)

{

int i=1

while (h&&h->data!=d)

{

h=h->next

i++

}

if (!h) i=-1

return i

}

int count(node *h)

{

int i=0

for (i = 0hi++) {

h=h->next

}

return i

}

void prt(node *h)

{

while (h)

{

printf(STY"\t",h->data)

h=h->next

}

putchar('\n')

}

void Free(node **h)

{

if (*h) {

Free(&(*h)->next)

free(*h)

*h=NULL

}

}

int menu(void)

{

int i

puts("******************")

puts("1.生成线性表")

puts("2.输出表元素")

puts("3.删除表元素")

puts("4.查找表元素")

puts("5.统计表元素")

puts("6.插入表元素")

puts("7.删除线性表")

puts("0.退出本程序")

puts("******************")

printf("请选择:")

scanf("%d",&i)

return i

}

void find(node *h)

{

eltp a

//node *t=NULL

int index

printf("请输入要查找的数字:")

scanf(STY,&a)

index=search(h,a)

if (index!=-1) {

printf(STY"是表中的第%d个元素\n",a,index)

}

else printf(STY"不是表中的元素\n",a)

}

node *insert_node(node *h,int index,eltp a)

{

node *hd=h,*in=(node *)malloc(sizeof(node))

int i

in->data=a

if (index>1) {

for (i=1h->next&&i<index-1i++) {

h=h->next

}

in->next=h->next

h->next=in

}

else {

in->next=hd

hd=in

}

return hd

}

node *remove_node(node *h)

{

eltp a

printf("请输入要删除的元素:")

scanf(STY,&a)

h=del(h,a)

puts("已完成")

return h

}

node *ins(node *h)

{

eltp a

int i

printf("请输入要插入的元素:")

scanf(STY,&a)

printf("请输入要插入的位置:")

scanf("%d",&i)

return insert_node(h,i,a)

}

int main(void)

{

node *head=NULL

int ch

init()

do

{

ch=menu()

switch (ch) {

default:printf("输入有误,重新输入\n")break

case 0:break

case 1:if(head) Free(&head)

head=create(10)

break

case 2:prt(head)break

case 3:head=remove_node(head)break

case 4:find(head)break

case 5:printf("表中共有%d个元素\n",count(head))break

case 6:head=ins(head)break

case 7:Free(&head)break

}

}while (ch)

Free(&head)

return 0

}

//---------------------------------------------------------------------------