单链表的基本操作
1. 建立一个空的带头节点的单链表
2. 采用头插法在单链表中插入n个元素
3. 删除单链表的第i个元素
4. 实现单链表按关键字查找操作
5. 计算单链表的表长并输出单链表
6. 销毁单链表
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
} LNode,*LinkList;
void Build(LinkList L)//建立一个带头结点的单链表
{
int n;
LinkList p,q;
p=L;
printf("请输入n和n个数据元素:\n");
scanf("%d",&n);
while(n--)
{
q=(LinkList)malloc(sizeof(LNode));
scanf("%d",&q->data);
q->next=NULL;
p->next=q;
p=q;
}
}
void Tips()
{
printf("按数字键选择相应操作\n");
printf("<1>输出单链表及其长度:\n");
printf("<2>查找值为x的直接前驱结点:\n");
printf("<3>删除表中的第i个元素:\n");
printf("<4>销毁单链表\n") ;
printf("<0>退出:\n");
}
void Find(LinkList L,int x)//查找值为x的直接前驱结点q
{
LinkList p;
p=L;
while( p->next&&p->next->data!=x)
p=p->next;
if(p->next)
printf("%d的前驱结点为:%d\n\n",x,p->data);
else
printf("没找到!!\n\n");
}
Status ListDelete(LinkList L,int i) //删除单链表中第i个元素
{
int j=0;
LinkList p=L,q;
while(p->next&&j<i-1)
{
p=p->next;
j++;
}
if(!p->next||j>i-1)
return ERROR;
q=p->next;
p->next=q->next;
free(q);
return OK;
}
void Print(LinkList L)//计算单链表长度并输出单链表
{
int num=0;
LinkList p;
p=L->next;
while(p)
{
num++;
printf("%d",p->data);
p=p->next;
}
printf("\n长度为%d:\n",num);
}
Status DestoryList(LinkList *L)//销毁单链表
{
LinkList q;
while(*L)
{
q=(*L)->next;
free(*L);
*L=q;
return OK;
}
}
int main()
{
int op,x,i;
LinkList L,p;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
L->data=-1;
Build(L);
Tips();
scanf("%d",&op);
while(op)
{
switch(op)
{
case 1:
Print(L);
break;
case 2:
printf("请输入要查找的元素X:\n");
scanf("%d",&x);
Find(L,x);
break;
case 3:
printf("请输入要查找的删除的元素位置i:\n");
scanf("%d",&i);
ListDelete(L,i);
break;
case 4:
DestoryList(&L);
printf("单链表已被销毁\n");
break;
}
Tips();
scanf("%d",&op);
}
return 0;
}