您的位置:首页 > 理论基础 > 数据结构算法

数据结构——单向链表的链式存储及实现

2013-10-26 19:04 711 查看
#include<iostream>
#include<cstdlib>
#include<cstdio>

using namespace std;
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}Node,*LinkList;
LinkList create()//创建链表
{
LinkList p,q,h;
ElemType x;
h=(Node *)malloc(sizeof(Node));
p=h;
printf("enter x:\n");
scanf("%d",&x);
while(x!=0)
{  q=(Node *)malloc(sizeof(Node));
q->data=x;
p->next=q;
p=q;
scanf("%d",&x);
}
p->next=NULL;
return h;
}
void list_display(LinkList h)//遍历
{
LinkList p;
p=h->next;

while(p!=NULL)
{
printf("%d  ",p->data);
p=p->next;
}
cout<<endl;
}

int LinkListDelete(LinkList h,int i,int *e)//删除
{
LinkList p,q;
p=h;
q=h->next;
int j=1;
while(q!=NULL&&j<i)
{
j++;
p=q;
q=q->next;
}
if(i==j&&q!=NULL)
{
p->next=q->next;
*e=q->data;
free(q);
return 1;
}
else
return 0;
}
int LinkListInsert(LinkList h,int i,ElemType e)//插入
{
LinkList p,q;
p=h;
int j=0;
while(j<(i-1)&&p->next!=NULL)
{
j++;
p=p->next;
}
if(j==i-1&&p->next!=NULL)
{
q=(Node *)malloc(sizeof(Node));
if(q==NULL)
return 0;
q->data=e;
q->next=p->next;
p->next=q;
return 1;
}
else
return 0;
}
LinkList linklistni(LinkList h)//逆置
{

LinkList p,q;
if (h==NULL)
{
printf("链表空!\n");
return h;
}
p=h->next; q=p->next;
p->next=NULL;
while(q!=NULL)
{     p=q;
q=p->next;
p->next=h->next;
h->next=p;

}

return h;
}
LinkList deleteeven(LinkList h)//删除偶数
{
LinkList p,q;
p=h->next;
q=h->next;
int i=1,t,s;
while(q!=NULL)
{
if(q->data%2==0)
{
p->next=q->next;
free(q);
}
else
p=q;

q=p->next;
}
return h;

}
void init()
{
printf("*********菜单*********\n");
printf("1.创建一个新链表\n");
printf("2.遍历链表\n");
printf("3.删除链表中的元素\n");
printf("4.插入链表中一个元素\n");
printf("5.对链表中的元素逆置\n");
printf("6.删除链表中的偶数\n");
}

int main()
{
init();
LinkList list;int n,t,i;
while(~scanf("%d",&n))
{
switch(n)
{
case 1:list=create();break;
case 2:list_display(list);break;
case 3:printf("输入要删除第几个\n");
scanf("%d",&i);
if(LinkListDelete(list,i,&t))
printf("删除成功\n");
else
printf("删除失败\n");
break;
case 4:printf("输入插入的元素的位置:");
scanf("%d",&i);
printf("输入插入的元素:");
scanf("%d",&t);
if(LinkListInsert(list,i,t))
{
printf("插入成功,插入后结果为:\n");
list_display(list);
}
else
printf("插入失败\n"); break;

case 5:list=linklistni(list);
printf("逆置结果为:\n");
list_display(list);break;
case 6:
list=deleteeven(list);
printf("删除结果为:\n");
list_display(list);
break;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 链表