1.头文件head.h
#include "stdio.h"
#include "stdlib.h"
#define TRUE 1
#define FALSE 0
typedef struct linknode{
int data;
struct linknode *next;
}Lnode,*LinkList;
void InitList1(Lnode *L)//单链表的初始化
{
L=(Lnode *)malloc(sizeof(Lnode));
L->next=NULL;
}
void InitList2(Lnode *&L)//单链表的初始化
{
L=(Lnode *)malloc(sizeof(Lnode));
L->next=NULL;
printf("请输入元素个数:");
int n;
scanf("%d",&n);
Lnode *q;
q=L;
printf("请输入元素序列:");
for(int i=0;i<n;i++)
{
Lnode *p=(Lnode *)malloc(sizeof(Lnode));
p->next=NULL;
scanf("%d",&p->data);
q->next=p;
q=p;
}
}
int Length(Lnode *L)//返回单链表的长度
{
int i=0;//计数器
Lnode *p=L->next;
while(p!=NULL)
{
i++;
p=p->next;
}
return i;
}
void PrintList(Lnode *L)//输出单链表中的元素
{
Lnode *p;
p=L->next;
printf("单链表中元素为:");
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("/n");
}
int ListInsert(Lnode *L,int i,int in)//在指定位置上插入一个元素
{
int j=1;
Lnode *q=L;
Lnode *p=(Lnode *)malloc(sizeof(Lnode));
p->next=NULL;
p->data=in;
if(i<1||i>Length(L)+1)
exit(0);
while(j<i)
{
q=q->next;
j++;
}
p->next=q->next;
q->next=p;
return 1;
}
int ListDelete1(Lnode *L,int out)//删除指定的元素
{
Lnode *p=L,*q;
while(p->data!=out)
{
q=p;
p=p->next;
}
q->next=q->next->next;
return 1;
}
int ListDelete2(Lnode *L,int i)//删除指定位置上的元素
{
int j=1;
Lnode *p=L,*q;
if(i<1||i>Length(L))
exit(0);
while(j<i)
{
p=p->next;
j++;
}
q=p->next;
p->next=q->next;
return 1;
}
Lnode *GetElem(Lnode *L,int i)//获取表中某元素
{
int j=1;
Lnode *p=L->next;
if(i<1||i>Length(L))
return NULL;
while(j<i)
{
p=p->next;
j++;
}
return p;
}
Lnode *PriorElem(Lnode *L,int x)//得到元素x的直接前驱
{
Lnode *p=L->next,*q=NULL;
while(p!=NULL&&p->data!=x)
{
q=p;
p=p->next;
}
return q;
}
2.主函数
#include "head.h"
void main()
{
int i;
printf("/n ***单链表基本运算的算法演示***/n/n");
Lnode *L;
L=(Lnode *)malloc(sizeof(Lnode));
printf("(1)单链表的初始化/n");
InitList2(L);
printf("/n/n(2)原始单链表的信息/n");
PrintList(L);
printf("单链表的长度为:%d/n",Length(L));
printf("/n/n(3)在指定位置插入一个元素/n");
printf("输入插入的位置及被插入的元素:");
int in;
scanf("%d%d",&i,&in);
ListInsert(L,i,in);
PrintList(L);
printf("单链表的长度为:%d/n",Length(L));
printf("/n/n(4)删除单链表中某个元素/n");
printf("输入待删除元素的值:");
int out;
scanf("%d",&out);
ListDelete1(L,out);
PrintList(L);
printf("单链表的长度为:%d/n",Length(L));
printf("/n/n(5)删除单链表中某个位置上的元素/n");
printf("输入待删除元素的位置:");
scanf("%d",&i);
ListDelete2(L,i);
PrintList(L);
printf("单链表的长度为:%d/n",Length(L));
printf("/n/n(6)获取单链表的元素/n");
printf("输入一个位置:");
scanf("%d",&i);
printf("该位置上的元素是:%d/n",GetElem(L,i)->data);
printf("/n/n(7)获取某元素的直接前驱/n");
PrintList(L);
printf("输入表中某个元素:");
scanf("%d",&i);
printf("该元素的直接前驱是:%d/n",PriorElem(L,i)->data);
printf("/n(8)按顺序合并两个有序单链表!/n");
Lnode *L1,*L2,*L3;
L1=(Lnode *)malloc(sizeof(Lnode));
L2=(Lnode *)malloc(sizeof(Lnode));
L3=(Lnode *)malloc(sizeof(Lnode));
printf("/n表L1的初始化/n");
InitList2(L1);
printf("/n表L2的初始化/n");
InitList2(L2);
InitList1(L3);
Lnode *p,*q,*t;
p=L1->next;
q=L2->next;
t=L3;
while(p!=NULL&&q!=NULL)
{
if(p->data<=q->data)
{
t->next=p;
p=p->next;
t=t->next;
}
else{
t->next=q;
q=q->next;
t=t->next;
}
}
if(p==NULL)
t->next=q;
if(q==NULL)
t->next=p;
printf("/n合并后单链表长度为:%d",Length(L));
printf("/n合并后");
PrintList(L3);
}