适合初学者的代码
刚开始接触这个东西是感觉有点懵逼,但是学完之后,感觉其实就是把原来放在数组中的元素,变成放在一个链表中了,别的操作几乎相同。
头插法创建链在遍历时元素输出的顺序与原来输进去的元素的顺序是相反的,而尾插则是相同的。
例如输进去的是1 2 3 4 5。
头插遍历是:5 4 3 2 1。
尾插遍利是:1 2 3 4 5。
这是我写的代码希望对那些初学链表的兄弟姐妹们有帮助。
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node *next;
};
typedef struct node *LinkList;
void tcj(LinkList head,int n)//头插法创建
{
LinkList p,t,q;
int i,a;
for(i=1;i<=n;i++)
{
p=(node *)malloc(sizeof(node));
scanf("%d",&a);
p->data=a;
p->next=head->next;
head->next=p;
}
printf("\n");
}
void wcj(LinkList head,int n)//尾插法创建
{
LinkList p,rear=head;
int i,a;
for(i=1;i<=n;i++)
{
p=(node *)malloc(sizeof(node));
scanf("%d",&a);
p->data=a;
rear->next=p;
rear=p;
}
rear->next=NULL;
}
void insert(LinkList head,int a,int i)//插入
{
LinkList q,p=head,t;
int j=1;
while(j<i)
{
p=p->next;
j++;
}
q=(node *)malloc(sizeof(node));
q->data=a;
q->next=p->next;
p->next=q;
//printf("******\n");
t=head->next;
while(t!=NULL)
{
printf("%d ",t->data);
t=t->next;
}
printf("\n");
}
void del(LinkList head,int i)//删除
{
LinkList q=head,p,t;
p=(node *)malloc(sizeof(node));
int j=1;
while(j<i)
{
q=q->next;
j++;
}
p=q->next;
q->next=p->next;
t=head->next;
while(t!=NULL)
{
printf("%d ",t->data);
t=t->next;
}
printf("\n");
}
void check(LinkList head,int a)//查询
{
LinkList t=head;
int flag=0;
while(t!=NULL)
{
if(t->data==a)
flag=1;
t=t->next;
}
if(flag==1)
printf("有\n");
else
printf("无\n");
}
int main(void)
{
LinkList head;
head=(node *)malloc(sizeof(node));
head->next=NULL;
int n,t,b,i;
printf("头插法创建链表输1\n尾插发创建链表输2\n插入输3\n");
printf("删除输4\n查询输5\n结束输0\n");
while(1)
{
scanf("%d",&t);
if(t==1)
{
printf("输入链表长度\n");
scanf("%d",&n);
tcj(head,n);
}
if(t==2)
{
printf("输入链表长度\n");
scanf("%d",&n);
wcj(head,n);
}
if(t==3)
{
printf("输入插入的元素及位置\n");
scanf("%d%d",&b,&i);
insert(head,b,i);
}
if(t==4)
{
printf("输入删除元素的位置\n");
scanf("%d",&i);
del(head,i);
}
if(t==5)
{
printf("输入要查询的元素\n");
scanf("%d",&b);
check(head,b);
}
if(t==0)
break;
}
return 0;
}