最近在准备考研,专业课方面首先开始了数据结构的复习,用的严奶奶的书,看了单链表的一节后,觉得有必要将单链表的基本操作具体实现,便于加深理解。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList HeadCreatList(LinkList L1){ //带头结点的头插法建立链表
LNode *s;
int x;
//L1=(LinkList)malloc(sizeof(LNode));//为头结点分配内存空间
//if(L1==NULL)
//printf("Memory application failed!\n");
L1->next=NULL; //头指针始终指向头结点,初始化为空表
printf("Please input the Elem : ");
scanf("%d",&x);
while(x!=999){ //输入999时输入终止
s=(LNode*)malloc(sizeof(LNode));//为新节点申请内存空间
if(s==NULL)printf("Memory Application failed!\n");
s->data=x;
s->next=L1->next;
L1->next=s;
scanf("%d",&x);
}
return L1; // 返回头指针
}
void Listprint(LinkList L1)
{
LinkList r=L1->next; //将头指针的指针域用r保存
while(r!=NULL) //依次打印链表中的元素
{
printf("%d ",r->data);
r=r->next;
}
printf("\n");
}
LinkList TailCreatList(LinkList L2){ //尾插法建立单链表
LNode *s;
LinkList t; //t是尾指针,始终指向最后一个数据元素
int x;
//L2=(LinkList)malloc(sizeof(LNode));//为头结点分配内存空间
//if(L2==NULL)
//printf("Memory application failed!\n");
L2->next=NULL; //初始化为空表
t=L2; //初始化尾指针
printf("Please input the Elem : ");
scanf("%d",&x);
while(x!=999){
s=(LNode*)malloc(sizeof(LNode));
if(s==NULL)printf("Memory Application failed!\n");
s->data=x;
t->next=s;
t=s; //t始终指向最后一个节点
scanf("%d",&x);
}
t->next=NULL; //尾指针赋空值
return L2;
}
LinkList insertElem(LinkList L)
{
LNode *s;
int i;ElemType e; //i为插入的位置,e为插入的元素
LNode *prio=L; //prio为第i个结点的前驱
int j=0;
printf("you will insert e,please input the position and the e :");
scanf("%d %d",&i,&e);
s=(LNode *)malloc(sizeof(LNode));
for(j=1;j<i;j++) //寻找第i个结点的前驱结点
{
prio=prio->next;
}
s->data=e; //插入元素后相关指针做相应的修改
s->next=prio->next;
prio->next=s;
return L;
}
LinkList deleteElem(LinkList L)
{
LNode *q,*temp=L;
int i;ElemType e; //i为删除元素的位置,e为删除的元素返回值
int j;
printf("you will delete e,please input the position :");
scanf("%d",&i);
for(j=1;j<i;j++) //寻找第i个结点
{
temp=temp->next;
}
e=temp->next->data; //保存删除元素的数据区
q=temp->next; //删除后的指针修改
temp->next=q->next;
free(q);
printf("%d has been deleted . \n",e);//删除元素回显
return L;
}
int main()
{
LinkList L1;
HeadCreatList(L1); //调用头插函数建立链表L1
printf("Headinsert List is :");
Listprint(L1);
TailCreatList(L1); //调用尾插函数重新建立链表L1
printf("Tailinsert List is :");
Listprint(L1);
insertElem(L1); //插入元素
printf("After insertion,the list is:");
Listprint(L1);
deleteElem(L1); //删除元素
printf("After deletinon,the list is:");
Listprint(L1);
return 0;
}
运行结果:
从程序运行结果可以看出,利用尾插法建立的单链表输出的数据顺序和从键盘输入的数据顺序一致。