单链表的各种操作
#include<stdio.h>
#include<malloc.h>
typedef struct node{
int data;
struct node *next;
}Node,*Linklist;
Linklist InitList()
{
Linklist L=(Linklist)malloc(sizeof(Node)),p,q;
int i=0;
L->next=NULL;
for(i=0;i<5;i++)
{
p=(Linklist)malloc(sizeof(Node));
if(L->next==NULL)
{
L->next=p;
p->data=i;
p->next=NULL;
q=p;
}
else{
p->data=i;
q->next=p;
p->next=NULL;
q=q->next;}
}
return L;
}
Linklist Insertnode(Linklist L,int i,int e)
{
Linklist p=L,s;
int j=0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
{
printf("错误的位置\n");
return L;
}
s=(Linklist)malloc(sizeof(Node));
s->data=e;
s->next=p->next;
p->next=s;
return L;
}
Linklist Deletenode(Linklist L,int i)
{
Linklist p=L,s;
int j=0;
while(p->next&&j<i-1)
{
p=p->next;
j++;
}
if(!(p->next)||j>i-1)
{
printf("错误的位置\n");
return L;
}
s=p->next;
p->next=s->next;
free(s);
return L;
}
void Getnode(Linklist L,int i)
{
Linklist p=L;
int j=0;
while(p->next&&j<i-1)
{
p=p->next;
j++;
}
printf("%d号节点的值为%d\n",i,p->next->data);
}
Linklist Clearlist(Linklist L)
{
Linklist p=L->next,s;
L->next=NULL;
while(p)
{
s=p->next;
free(p);
p=s;
}
return L;
}
void Listlength(Linklist L)
{
int j=0;
Linklist p=L->next;
while(p)
{
j++;
p=p->next;
}
printf("链表的长度为:%d\n",j);
}
void Showlist(Linklist L)
{
Linklist p=L->next;
while(p)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
void Showmenu(Linklist L)
{
int i=0,e=0,k=0;
while(1)
{
printf("请输入相应数字选择所需的操作:\n");
printf("1.插入节点\n");
printf("2.删除节点\n");
printf("3.查询节点的值\n");
printf("4.查看链表元素\n") ;
printf("5.清空链表\n") ;
printf("6.查询链表长度:\n");
scanf("%d",&k);
switch(k)
{
case 1:
{
printf("请输入插入节点的位置:");
scanf("%d",&i);
printf("请输入插入节点的值:") ;
scanf("%d",&e);
Insertnode(L,i,e);
}break;
case 2:
{
printf("请输入删除节点的位置:");
scanf("%d",&i);
Deletenode(L,i);
}break;
case 3:
{
printf("请输入查询的节点号:");
scanf("%d",&i);
Getnode(L,i);
}break;
case 4:
{
Showlist(L);
}break;
case 5:
{
Clearlist(L);
}break;
case 6:
{
Listlength(L);
}
}
}
}
int main()
{
Linklist L=InitList();
Showmenu(L);
}