简单链表的创建、插入、删除、查找的基本操作
要考虑插入和删除要考虑i==1?
要考虑NULL等等
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define len sizeof(struct node)
typedef struct node* point;
typedef struct node
{
int data;
point next;
}List;
int n;
point create()//创建链表
{ int i=0;
point head;
point p1;
point p2;
head=NULL;
p1=(point)malloc(len);
p2=p1;
scanf("%d",&p1->data);
while(p1->data)//假设输入0 则输入结束
{
if(i==0)
head=p1;//第一个新建结点是表头
else
p2->next=p1;// 原表尾的下一个结点是新建结点
p2=p1;//新建结点成为表尾
p1=(point)malloc(len);//新建一个结点
i++;
scanf("%d",&p1->data);
}
free(p1); // 对于num=0的结点,未加入链表,应删除其空间
p2->next=NULL; //输入结束,表尾结点的下一个结点为空 ,封尾
return (head);
}
void print(point head)//输出链表
{
struct node* p;
p=head;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
int length(point head)//求表长
{
point p=head;
int j =0;
while(p)
{
p=p->next;
j++;
}
return j;
}
point findkth(point head,int k)//找序号所对应的元素
{
point p=head;
int i=1;
while(p!=NULL&&i<k)
{
p=p->next;
i++;
}
if(i==k)
return p;
else
return NULL;
}
void findx(point head,int x)//按值查找
{
point p=head;
while(p!=NULL)
{
if(p->data==x)
{printf("已找到!\n");
return;
}
else
p=p->next;
}
printf("链表中无此元素!\n");
return;
}
point Insert(point head,int i,int x)//在第i个点插入
{
point p,s;
if(i==1)//考虑第一个
{
s=(point)malloc(len);
s->data=x;
s->next=head;
return s;
}
p=findkth(head,i-1);
if(p==NULL)
{
printf("插入位置错误\n");
return NULL;
}
else
{ s=(point)malloc(len);
s->next=p->next;
s->data=x;
p->next=s;
return head;
}
}
point deleteth(point head,int i)//删除第i位元素
{ point s,p;
if(i==1)//考虑要删除的元素为第一个
{
s=head;
if(head!=NULL)
head=s->next;
else
return NULL;
free(s);
return head;
}
p=findkth(head,i-1);
if(p==NULL)
{
printf("第%d个节点不存在\n",i);
return NULL;
}
else if(p->next==NULL)
{
printf("第%d个节点不存在\n",i);
return NULL;
}
else
{
s=(point)malloc(len);
s=p->next;
p->next=s->next;
free(s);
return head;
}
}
int main()
{ int i,x;
char c;
point head;
printf("1.链表的创建\n");
printf("2.链表元素的插入\n");
printf("3.链表元素的删除\n");
printf("4.链表的查找\n");
printf("5.显示链表\n");
printf("6.退出\n");
while(1)
{
printf("\n请输入数字!\n");
scanf("%s",&c);
switch(c)
{
case '1':head=create();break;
case '2':printf("请输入需要插入的位置和值,输入0 则为输入结束\n");
scanf("%d %d",&i,&x);
head=Insert(head,i,x);break;
case '3':printf("请输入需要删除的位置\n");
scanf("%d",&i);
head=deleteth(head,i);break;
case '4':printf("请输入需要查找的值\n");
scanf("%d",&x);
findx(head,x);break;
case '5':print(head);break;
case '6':printf("使用结束!");exit(0);
default:exit(1);
}
}
return 0;
}