#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
}
//---------------------------------------------------------------------------