接下来总结一下线性表的线性链表存储结构:由于单链表的数据元素之间的逻辑关系是由结点中的指针指示的,指针的指向连接了单链表中各个结点的逻辑关系。
以下是线性表的单链表存储结构:
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
然后,分别用各个函数来实现单链表的功能,如创建,显示,插入,删除,查找。
以下是源程序:
//预编译命令
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//数据结构
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//函数首部
int menu_select();
void CreateList_L(LinkList &L,int n);
void PrintList_L(LinkList L);
Status GetElem_L(LinkList &L,int i, ElemType &e);
Status ListInsert_L(LinkList &L,int i,ElemType e);
Status ListDelete_L(LinkList &L,int i,ElemType &e);
//主函数
int main()
{
ElemType e;
LinkList L;
Status s;
int n,i;
for(;;)
{
switch(menu_select())
{
case 1:
printf("请输入单链表的长度:");
scanf("%d",&n);
CreateList_L(L,n);
printf("创建成功。\n");
break;
case 2:
printf("单链表中的元素是:\n");
PrintList_L(L);
break;
case 3:
printf("请输入待查元素的位序:");
scanf("%d",&i);
s=GetElem_L(L,i,e);
if(s)
printf("第%d个元素的值为%d",i,e);
else
printf("查找失败。\n");
break;
case 4:
printf("请输入插入的位序和新元素的值(以空格分开):");
scanf("%d%d",&i,&e);
s=ListInsert_L(L,i,e);
if(s)
printf("插入成功\n");
else
printf("插入失败\n");
break;
case 5:
printf("请输入删除的位序:");
scanf("%d",&i);
s=ListDelete_L(L,i,e);
if(s)
printf("删除了元素%d成功\n",e);
else
printf("删除失败\n");
break;
case 0:
printf("程序结束,谢谢使用!\n\n");
exit(0);
}
}
return 0;
}
int menu_select()
{
int sn;
printf("\n显示菜单\n");
printf("1.创建\n");
printf("2.显示\n");
printf("3.取元素\n");
printf("4.插入\n");
printf("5.删除\n");
printf("0.退出\n");
printf("输入 0-6:");
for(;;)
{
scanf("%d",&sn);
if(sn<0||sn>5)
printf("\n输入错误,重选0-5:");
else
break;
}
return sn;
}
//创建函数
void CreateList_L(LinkList &L,int n)
{
LinkList p;
int i;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
printf("请输入%d个数据元素(整型数):\n",n);
for(i=n;i>0;i--)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
}
//输出函数
void PrintList_L(LinkList L)
{
LinkList p;
p=L->next;
while(p)
{
printf("%d\t",p->data); // \t:分隔符
p=p->next;
}
printf("\n");
}
//查找函数
Status GetElem_L(LinkList &L,int i, ElemType &e)
{
LinkList p;
p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;
}
//插入函数
Status ListInsert_L(LinkList &L,int i,ElemType e)
{
LinkList p,s;
p=L;
int j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
return ERROR;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
//删除函数
Status ListDelete_L(LinkList &L,int i,ElemType &e)
{
int j=0;
LinkList p,q;
p=L;
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;
e=q->data;
free(q);
return OK;
}