#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}lnode;
void lenlnoded(lnode *l,int *n)//求长度
{
int len=0;
lnode *p=l;
p=p->next;
while(p) //链表存在
{
len+=1;
p=p->next;//指向下一个节点
}
*n=len;
}
void seektlnode(lnode *l,int date) //查找
{
lnode *p=l;
while(p)
{
if(p->data==date)
{
printf("%d:元素存在\n",p->data);
return ;
}
p=p->next;
}
printf("元素不存在");
}
void insertlnode(lnode *l,int n,int c)//元素插入
{
lnode *p=l,*p2,*node;
int i=0;
p=p->next;
while(p)
{
i+=1;
if(i==n)
{
p2=p;
p=p->next;
node=(lnode *)malloc(sizeof(lnode));//创建一个节点
while(!node)
{
node=(lnode *)malloc(sizeof(lnode));//开辟失败重新开辟
}
node->data=c;//给数据域赋值
node->next=p;//该节点指向插入位置的下一个节点
p2->next=node;//插入位置的的上一个节点指向该节点
}
p=p->next;//未到插入位置指向下一个节点
}
}
void detelelnode(lnode *l,int n)// 删除节点
{
lnode *p=l,*p1;
p1=p;
p=p->next;
while(p)
{
if(p->data==n)
{
p1->next=p->next;//将指向要删除节点的的指针域指向要删除节点的指向的下一个节点
free(p);//释放该节点
return ;
}
p1=p;
p=p->next;//指向下一个节点
}
}
void releasenode(lnode *l)//释放链表
{
lnode *p1=l,*p2;
p1=p1->next;
while(p1)
{
p2=p1->next;//指向要释放的下一个节点
free(p1); //释放该节点
p1=p2; //指向下一个节点
}
free(p1);
}
void printlnode(lnode *l)// 输出元素
{
lnode *p1=l;
p1=p1->next;
while(p1)
{
printf("%d ",p1->data);
p1=p1->next;
}
printf("\n");
}
void found(lnode *l) //创建链表
{
lnode *p1=l,*p2;
int n,i=0;
printf("输入链表长度:\n");
scanf("%d",&n);//输入链表长度
printf("输入数据元素:\n");
while(p1)
{
if(i==n)
break;
p2=(lnode *)malloc(sizeof(lnode));//开辟一个节点
while(!p2)//若开辟失败,直到开辟成功为止
{
p2=(lnode *)malloc(sizeof(lnode));//开辟失败,重新开辟
}
scanf("%d",&p2->data);//输入数据
i+=1;
p1->next=p2;
p1=p1->next;
}
p1->next=NULL;//链表末尾指针域位空
}
int main()
{
int tem,nu,len=0;
lnode *head;
/*创建链表*/
head=(lnode *)malloc(sizeof(lnode));//创建头节点
while(!head)
{
head=(lnode *)malloc(sizeof(lnode));//开辟失败重新开辟
}
found(head);//创建链表
/*求链表长度*/
lenlnoded(head,&len);
printf("当前链表长度:%d\n",len);
/*元素插入*/
printf("输入插入元素位置,以及要插入的元素:\n");
scanf("%d %d",&tem,&nu);
while(tem<1||tem>len)
{
printf("插入位置不合法,请重新输入要插入的位置:\n");
scanf("%d",&tem);
}
insertlnode(head,tem,nu);
/*输出元素*/
printlnode(head);
/*求链表长度*/
lenlnoded(head,&tem);
printf("当前链表长度:%d\n",tem);
/*元素删除*/
printf("输入要删除的元素:\n");
scanf("%d",&nu);
detelelnode(head,nu);
/*输出元素*/
printlnode(head);
/*求链表长度*/
lenlnoded(head,&tem);
printf("当前链表长度:%d\n",tem);
/*元素查找*/
printf("输入要查找的元素:\n");
scanf("%d",&nu);
seektlnode(head,nu);
/*链表释放*/
releasenode(head);//释放链表
return 0;
}
转载于:https://my.oschina.net/u/3026393/blog/784218