#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct LNode{
int data;
LNode *next;
}LNode,*LinkList;//定义单链表 (单链表的存储结构)
void InitList(LinkList&L)
{
L=(LinkList)malloc(sizeof(LNode));
if(!L)
printf("创建失败");
L->next=NULL;
}//初始化单链表
void CreateList(LinkList&L)
{
int i=0;
int e,n;
LinkList p,r;
L=(LinkList)malloc(sizeof(LNode));
r=L;
printf("创建链表所含数据数:");
scanf("%d",&n);
printf("请输入%d个数据:\n",n);
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
r->next=p;
r=r->next;
}
p->next=NULL;
}//创建单链表
void PutList(LinkList L)
{
LinkList p;
p=L->next;
printf("输出单链表为: ");
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}//输出单链表
int ListLength(LinkList L)
{
int i=0;
LinkList p=L->next;
while(p)
{
i++;
p=p->next;
}
return i;
}//求表长
int Getelem(LinkList L,int m)
{
int j=1;
LinkList p=L->next;
int e;
while(j<m && p)
{
j++;
p=p->next;
}
if(j==m && p)
{
e=p->data;
}
printf("该处元素为: %d\n",e);
}//取表中元素
void ListTraverse(LinkList&L)
{
LinkList p,q,r;
p=L->next;
q=NULL;
while(p)
{
r=p->next;
p->next=q;
q=p;
p=r;
}
L->next=q;
PutList(L);
}//单链表逆置
void ListInsert(LinkList&L,int i,int e)
{
int j=1;
LinkList s,p=L->next;
s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=NULL;
if(i==1)
{
s->next=L;
L=s;
}
else
{
while(p&&j<i-1)
{
j++;
p=p->next;
}
s->next=p->next;
p->next=s;
}
PutList(L);
}//插入元素
void ListDelete(LinkList&L,int i)
{
int j=1;
int e;
LinkList q,p=L->next;
if(i==1)
{
L=p->next;
e=p->data;
free(p);
}
else
{
while(p->next&&j<i-1)
{
j++;
p=p->next;
}
q=p->next;
p->next=q->next;
e=q->data;
free(q);
}
PutList(L);
}//删除元素
int main()
{
LinkList L;
InitList(L);
int a,b,d,m;
CreateList(L);
PutList(L);
int i=ListLength(L);
printf("该表表长为:%d\n",i);
printf("取单链表元素的位置: ");
scanf("%d",&m);
Getelem(L,m);
ListTraverse(L);
printf("输入插入位置及插入元素:");
scanf("%d%d",&a,&b);
ListInsert(L,a,b);
printf("输入删除元素位置:");
scanf("%d",&d);
ListDelete(L,d);
return 0;
}//主函数
运行效果