赞
踩
一、单链表抽象数据类型定义:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int Elemtype;//数据类型重定义
typedef int Status;//状态类型重定义
typedef struct LNode{
Elemtype data; //数据域
struct LNode *next;//指针域
}LNode,*Linklist;
Status LengthList(Linklist *L); //函数声明
二、单链表的初始化:
/*单链表初始化 ,初始化成功返回1,否则返回0*/
Status Init_linklist(Linklist *L)
{
*L=(Linklist)malloc(sizeof(LNode));//创建头结点
if(!(*L)) //创建失败
{
return ERROR;
}
(*L)->next=NULL; //将头结点的指针指向为空
return OK;
}
三、尾插入构建单链表:
/*创建带头结点的单链表尾插法*/ void Creat_Linklist(Linklist *L,int n) { Linklist p,q; int i; p = *L; for(i=0;i<n;i++) { printf("请输入链表第%d个元素:",i); q=(Linklist)malloc(sizeof(LNode));//创建新的节点 scanf("%d",&q->data); p->next=q; //头结点指针指向新生成的节点 p=q; //指针指向链尾 } p->next=NULL; //链尾节点的指针指向为空 }
四、单链表的插入:
/*带头结点的单链表插入,在i个位置前插入e,若成功则返回1,若失败则返回0*/ Status Insert_Linklist(Linklist *L,int i,Elemtype e) { int j=1; Linklist p,q; p = *L; if(i<1||!p->next||i>LengthList(L)) //插入位置不合理 { return ERROR; } while(p&&j<i) //找到插入点 { p=p->next; j++; } q=(Linklist)malloc(sizeof(LNode));//创建插入新节点 q->data=e; q->next=p->next; p->next=q; return OK; }
五、单链表的删除:
/*带头结点的单链表删除,删除第i个元素,并由e返回其值,删除成功则返回1,否则返回0*/ Status Delete_Linklist(Linklist *L,int i,Elemtype *e) { int j=1; Linklist p,q; p = *L; if(i<1||!p->next||i>LengthList(L)) { return ERROR; } while(j<i&&p->next) { p=p->next; j++; } q=p->next; *e=q->data; p->next=q->next; free(q); return OK; }
六、单链表的按值查找:
/*单链表按值查找*/
Status Locate_Linklist(Linklist *L,Elemtype e)
{
int i=1;
Linklist p,q;
p = (*L)->next;
while(p->data!=e&&p)
{
p=p->next;
i++;
}
if(p->data!=e) return -1;
else return i;
}
七、单链表的按位读取:
/*单链表按序号查找,用e返回该序号元素的值,否则查找失败*/ Status Get_Linklist(Linklist *L,int i,Elemtype *e) { int j=1; Linklist p,q; p = *L; if(i<1||!p->next||i>LengthList(L)) { return ERROR; } while(j<=i&&p) { p=p->next; j++; } if(j-1==i) { *e=p->data; return OK; } else return ERROR; }
八、单链表表长:
/*单链表表长*/
Status LengthList(Linklist *L)
{
int i=0;
Linklist p,q;
p = *L;
if(p->next==NULL) return ERROR;
while(p->next!=NULL)
{
i++;
p=p->next;
}
return i;
}
九、单链表的输出函数:
/*单链表输出函数*/
void Display(Linklist *L)
{
LNode *p;
p=(*L)->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
十、主函数:
int main() { int n,num,e,value; Linklist L; /*单链表的初始化*/ value=Init_linklist(&L); if(value) printf("单链表初始化成功!\n"); else return ERROR; printf("请输入单链表的长度:") ; scanf("%d",&n); Creat_Linklist(&L,n); printf("单链表中各元素的值为:"); Display(&L); /*单链表的插入*/ printf("\n请输入插入的位置:"); scanf("%d",&n); printf("请输入插入的元素:"); scanf("%d",&num); Insert_Linklist(&L,n,num); printf("进行插入操作后\n单链表中各元素的值为:"); Display(&L); /*单链表的删除操作*/ printf("\n\n请输入删除的位置:"); scanf("%d",&n); Delete_Linklist(&L,n,&e); printf("被删除元素的值为:%d",e); printf("\n进行删除操作后\n单链表中各元素的值为:"); Display(&L); /*单链表按值查找*/ printf("\n\n请输入要查找的值e= "); scanf("%d",&num); value=Locate_Linklist(&L,num); if(value>0) printf("该元素在线性表的位序位:%d",value); else printf("\n无该值,查找失败!"); /*单链表按位查找*/ printf("\n\n请输入要查找的位置:"); scanf("%d",&n); value=Get_Linklist(&L,n,&e); if(value) printf("单链表中第%d位的值为%d",n,e); else printf("\nerror!") ; return 0; }
十一、运行效果截图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。