/*用C/C++语言编写程序,完成以下功能 :
1 运行时输入数据,创建一个单链表
2 可在单链表的任意位置插入新结点
3 可删除单链表的任意一个结点
4 在单链表中查找所有值等于x的结点
5 输出单链表 */
#include <stdio.h>
#include <stdlib.h>
#define M 6
struct Lnode
{
int data;
struct Lnode *next;
};
struct Lnode *Create(int n)
{
int x;
int i;
struct Lnode *head,*p,*q;
head=(struct Lnode*)malloc(sizeof(struct Lnode));
head->next =NULL;
q=head;
for(i=0;i<n;i++)
{
p=(struct Lnode*)malloc(sizeof(struct Lnode));
scanf("%d",&x);
p->data =x;
p->next =NULL;
q->next =p;
q=p;
}
return head;
}
struct Lnode *GetNode(struct Lnode *head,int i)
{
struct Lnode *p;
int j=0;
p=head;
while(p->next !=NULL&&j<i)
{
p=p->next ;
j++;
}
if(j==i) return p;
}
struct Lnode *ListInsert(struct Lnode *head)
{
int i;
int x;
printf("请输入您要插入的位置和数字:");
scanf("%d%d",&i,&x);
struct Lnode *p,*s;
p=GetNode(head,i-1);
if(p==NULL)
{
printf("Error!");
exit(0);
}
s=(struct Lnode *)malloc(sizeof(struct Lnode));
s->data =x;
s->next =p->next ;
p->next =s;
return head;
}
struct Lnode *ListDelete(struct Lnode *head)
{
int i;
printf("请输入您要删除的节点:");
scanf("%d",&i);
struct Lnode *p,*s;
p=GetNode(head,i-1);
if(p==NULL||p->next ==NULL)
{
printf("Error!");
exit(0);
}
s=p->next ;
p->next =p->next ->next ;
free(s);
return head;
}
void LocateList(struct Lnode *head)
{
int x;
int j=1;
printf("请输入您要查找的值:");
scanf("%d",&x);
struct Lnode *p;
p=head->next ;
while(p!=NULL&&p->data!=x)
{
p=p->next ;
j++;
}
if(p->data ==x)
printf("您要查找的值的位置为:%d\n",j);
else
printf("查找失败!不存在此元素!\n");
}
void Print(struct Lnode *head)
{
struct Lnode *p;
printf("链表中的元素为:\n");
p=head->next;
if(head!=NULL)
do
{
printf("%d ",p->data);
p=p->next;
}while(p!=NULL);
printf("\n");
}
void Menu()
{ printf("*******************************************\n");
printf("* 1--------------------插入节点 *\n");
printf("* 2--------------------删除节点 *\n");
printf("* 3--------------------查找节点 *\n");
printf("* 4--------------------打 印 *\n");
printf("* 5--------------------退 出 *\n");
printf("*******************************************\n");
}
void main()
{
struct Lnode *pL;
printf("请输入数据(6):");
pL=Create(M);
int choose;
while(1)
{
Menu();
scanf("%d",&choose);
switch(choose)
{
case 1: ListInsert(pL);
break;
case 2: ListDelete(pL);
break;
case 3: LocateList(pL);
break;
case 4: Print(pL);
break;
case 5: exit(1);
break;
}
}
}