线性表的链式存储结构和操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//作者:zhoucanji
//线性表的链式存储结构和操作
//单链表
//C语言版
#include
#include
#define MAX 100
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}ListNode;
//初始化线性表
void InitList(ListNode **L)
{
(*L)=(ListNode *)malloc(sizeof(ListNode));
(*L)->next=NULL;
}
//遍历线性表
void DispList(ListNode *L)
{
ListNode *p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//创建线性表
void CreateListR(ListNode *L,ElemType a[],int n)
{
ListNode *s,*r;
int i;
r=L;
for(i=0;is=(ListNode *)malloc(sizeof(ListNode));
s->data=a[i];
r->next=s;
r=s;
r->next=NULL;
}
}
void InitArray(int *a,int n)
{
int i;
for(i=0;ia[i]=i+1;
}
}
void DispalyArray(int *a,int n)
{
int i;
for(i=0;iprintf("%d ",a[i]);
}
printf("\n以上是数组a[MAX]的遍历\n");
}
//求线性表的长度
int ListLength(ListNode *L)
{
ListNode *p=L;
int i=0;
while(p->next!=NULL){
p=p->next;
i++;
}
return i;
}
//判断线性表是否为空
int ListEmpty(ListNode *L)
{
return (L->next!=NULL);
}
//销毁线性表
int DestroyList(ListNode *L)
{
ListNode *p,*q;
p=L;q=L->next;
while(q!=NULL){
free(p);
p=q;
q=p->next;
}
free(p);
return (q==NULL);
}
//求线性表中某个数据元素的值
int GetElem(ListNode *L,int i,ElemType *e)
{
int j=0;
ListNode *p=L;
while (jj++;
p=p->next;
}
if(p==NULL)
return 0;
else
{
*e=p->data;
return 1;
}
}
//求线性表中是否存在某个元素!
int LocateElem(ListNode *L,int e)
{
int j=0;
ListNode *p=L;
while(p!=NULL&&p->data!=e){
p=p->next;
j++;
}
if(p==NULL)
return -1;
else
return j;
}
//在线性表中插入某个元素
int ListInsert(ListNode *L,int w,int e)
{
int j=0;
ListNode *p,*s;
p=L;
while(jj++;
p=p->next;
}
if(p==NULL)
return 0;
else{
s=(ListNode *)malloc(sizeof(ListNode));
s->data=e;
s->next=p->next;
p->next=s;
return 1;
}
}
//在线性表中删除某个元素的节点
int ListDelete(ListNode *L,int w)
{
ListNode *p,*s;
int j=0;
p=L;
while(jj++;
p=p->next;
}
if(p==NULL)
return 0;
else{
s=p->next;
if(s==NULL)
return 0;
p->next=s->next;
free(s);
return 1;
}
}
int main()
{
int a[MAX];
int length;
int empty;
int number;
int positio

n;
int element;
int result;
InitArray(a,MAX);
DispalyArray(a,MAX);
ListNode *head,*p;
InitList(&head);
p=head;
CreateListR(p,a,MAX);
DispList(head);
while(1){
printf("\n");
printf("请输入对应的数字,选择相应的功能!\n");
printf("按其它键,退出程序!\n");
printf("输入1,求线性表中某个数据元素的值!\n");
printf("输入2,求线性表的长度!\n");
printf("输入3,判断线性表是否为空!\n");
printf("输入4,销毁线性表!\n");
printf("输入5,遍历线性表!\n");
printf("输入6,求线性表中是否存在某个元素!\n");
printf("输入7,在线性表中插入某个元素!\n");
printf("输入8,在线性表中删除某个元素的节点!\n");
printf("----------------------------------------------------------\n");
scanf("%d",&number);
switch(number){
case 1://求线性表中某个数据元素的值
printf("请输入节点的位置?\n");
scanf("%d",&position);
result=GetElem(head,position,&element);
if(result)
printf("在线性表中位置为%d的元素为%d\n",position,element);
else
printf("在线性表中不存在%d的位置\n",position);
break;
case 2://求线性表的长度
length=ListLength(head);
printf("线性表的长度为: %d \n",length);
break;
case 3://判断线性表是否为空
empty=ListEmpty(head);
if(empty==0)
printf("线性表为空\n");
else
printf("线性表不为空\n");
break;
case 4://销毁线性表
result=DestroyList(head);
if(result)
printf("线性表销毁成功!\n");
else
printf("线性表销毁失败!\n");
break;
case 5://遍历线性表
DispList(head);
break;
case 6://求线性表中是否存在某个元素!
printf("请输入元素的值?\n");
scanf("%d",&element);
result=LocateElem(head,element);
if(result)
printf("存在,元素%d位于线性表中第%d个节点!\n",element,result);
else
printf("线性表不存在,元素%d!\n",element);
break;
case 7://在线性表中插入某个元素
printf("请输入元素的值?\n");
scanf("%d",&element);
printf("请输入元素的位置?\n");
scanf("%d",&position);
result=ListInsert(head,position,element);
if(result)
printf("插入成功,元素%d位于线性表中第%d个节点!\n",position,result);
else

printf("插入失败.");
break;
case 8://在线性表中删除某个元素的节点
printf("请输入元素的位置?\n");
scanf("%d",&position);
result=ListDelete(head,position);
if(result)
printf("删除成功,线性表中第%d个节点已删除!\n",position);
else
printf("删除失败.");
break;
break;
default://退出程序
exit(1);
}
}
return 0;
}

相关文档
最新文档