您的位置:首页 > 其它

One-day-one-program(4)之链表的实现

2014-03-28 16:59 323 查看
本程序主要实现链表的创建(包括前插法和后插法)、输出、按值查找、按序号查找以及删除和插入等基本功能的实现;此链表是不带头结点的单向链表。

#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
typedef struct LNode
{
datatype data;
struct LNode *next;
}LNode,*LinkList;

LinkList Creat_LinkList1()//头插法
{
LNode *s;
LinkList L=NULL;
int x;
printf("请输入要存的数值:\n");
scanf("%d",&x);
while(x!=-1)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L;
L=s;
scanf("%d",&x);
}
return L;
}

LinkList Creat_LinkList2()//尾插法
{
LinkList L=NULL;
LNode *s,*r=NULL;
int x;
printf("请输入要存的数值:\n");
scanf("%d",&x);
while(x!=-1)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=NULL;
if(L==NULL)
L=s;
else
r->next=s;
r=s;
scanf("%d",&x);
}
return L;
}

void Print(LinkList L)//输出函数(包括求表长)
{
int lenth=0;
LinkList p=L;
while(p)
{
printf("%d\n",p->data);
p=p->next;
lenth++;
}
printf("链表长度为:");
printf("%d\n",lenth);
}

LNode *Locate_LinkList(LinkList L,datatype x)//查找函数(按值查找)
{
LNode *p=L;
while(p!=NULL&&p->data!=x)
p=p->next;
return p;
}

int Insert_LinkList(LinkList L,datatype elm,datatype x)//插入函数
{
LNode *s,*p;
p=Locate_LinkList(L,elm);
if(p==NULL)
{
printf("p是空的\n");
return 0;
}
else
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=p->next;
p->next=s;
return 1;
}
}

LNode *Get_LinkList(LinkList L,int i)//按序号查找
{
LNode *p=L;
int j=1;
while(p!=NULL&&j<i)
{
p=p->next;
j++;
}
return p;
}

int Delete_LinkList(LinkList L,int i)//删除函数
{
LinkList p,s;
p=Get_LinkList(L,i-1);
if(p==NULL)
{
printf("i-1不存在\n");
return -1;
}
else if(p->next==NULL)
{
printf("i不存在\n");
return 0;
}
else
{
s=p->next;
p->next=s->next;
free(s);
return 1;
}
}

void main()
{
LinkList p;
//p=Creat_LinkList1();
p=Creat_LinkList2();
Print(p);

//查找
/*int x;
LNode *s;
printf("请输入你要查找的数:\n");
scanf("%d",&x);
s=Locate_LinkList(p,x);
printf("%d",s->data);*/

//插入
/*int y;
int z;
int a;
printf("请输入要插入的数:\n");
scanf("%d",&y);
printf("请输入要插入到的位置:\n");
scanf("%d",&z);
a=Insert_LinkList(p,z,y);
Print(p);*/
//删除
int i;
int j;
printf("请输入你要删除的数的序号:\n");
scanf("%d",&i);
j=Delete_LinkList(p,i);
printf("删除后的链表为:\n");
Print(p);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: