#include<stdio.h>
#include<stdlib.h>
#define ElemType char
#define OK 1
typedef struct Node
{
ElemType data;
struct Node *next;
}LNode,*LinkList;
//初始化链表
void InitList(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
}
//销毁链表
void DestroyList(LinkList &L)
{
LinkList q;
while(L)
{
q=L->next;
free(q);
q=L;
}
}
//头插法创建单链表
void CreatFromHead(LinkList &L)
{
int flag=1;//用来判断是否插入完毕
char c;
LNode *s;//创建一个新的结点
printf("头插法创建单链表,请依次输入单链表中的值,以#结尾\n");
while(flag)
{
c=getchar();
if(c!='#')
{
s=(LinkList)malloc(sizeof(LNode));
s->data=c;
s->next=L->next;
L->next=s;
}
else
{
flag=0;
}
}
}
//尾插法创建单链表
void CreatFromTail(LinkList &L)
{
int flag=1;
char c;
LNode *s;
LinkList r;
r=L;
printf("尾插法创建单链表,请依次输入单链表中的值,以#结尾\n");
while(flag)
{
c=getchar();
if(c!='#')
{
s=(LinkList)malloc(sizeof(LNode));
s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL;//将最后一个结点的next设置为空,表示链表的结束
}
}
}
//按序号查找,查找第i个结点
LNode* Get(LinkList L,int i)
{
int j;
LNode *p;
p=L;
j=0;
if(i<=0)//如果i的输入不正确
return NULL;
while(j<i&&p->next!=NULL)
{
p=p->next;
j++;
}
if(i==j)
return p;
else
return NULL;
}
//按值查找,查找L中某个取值为key的结点,并返回其值
LNode* Locate(LinkList L,ElemType key)
{
LNode *p;
p=L->next;
while(p!=NULL&&p->data!=key)
{
p=p->next;
}
return p;
}
//求单链表的长度
int ListLength(LinkList L)
{
LNode *p;
p=L->next;
int len=0;
while(p!=NULL)
{
p=p->next;
len++;
}
return len;
}
//单链表的插入,在第i个结点之前插入e
int InsList(LinkList L,int i,ElemType e)
{
LNode *p,*s;
int j=0;
p=L;
while(j<i-1&&p->next!=NULL)//寻找第i-1个结点
{
p=p->next;
j++;
}
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;//p是第i-1个结点,让s结点的下一个为原来的第i个结点
p->next=s;//让腾出来的第i个结点为s
return OK;
}
//单链表的删除,删除第i个结点,并把删除的结点赋值给e
int DelList(LinkList L,int i,ElemType &e)
{
LNode *p,*q;
int j=0;
p=L;
while(j<i-1&&p!=NULL)//寻找第i-1个结点
{
p=p->next;
j++;
}
q=p->next;//让q为第i个结点
e=q->data;//e为第i个结点的值
p->next=q->next;//第i-1个结点的下一个为原来第i个的下一个(原来的第i+1个)
free(q);//删除第i个
return OK;
}
//合并两个有序的单链表,合并后仍然有序
LinkList MergeLinkList(LinkList LA,LinkList LB)
{
LNode *pa,*pb;
LinkList LC,r;
pa=LA->next;
pb=LB->next;
LC=LA;
LC->next=NULL;
r=LC;//这里设置了一个尾结点
while(pa!=NULL&&pb!=NULL)
{
if(pa->data<pb->data)
{
r->next=pa;
r=pa;
pa=pa->next;
}
else
{
r->next=pb;
r=pb;
pb=pb->next;
}
if(pa==NULL)
{
r->next=pb;
}
else
{
r->next=pa;
}
free(LB);
return LC;
}
}
//读取当前链表
void Print(LinkList L)
{
LNode *p;
p=L->next;
printf("现在的链表是:\n");
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
int i;
char e;
LinkList LA,LB;
LNode* p;
InitList(LA);
InitList(LB);
CreatFromHead(LA);
Print(LA);
printf("你想在第几个元素之前插入:\n");
scanf("%d",&i);
getchar();
printf("请输入你要插入的元素:\n");
scanf("%c",&e);
InsList(LA,i,e);
Print(LA);
printf("你想删除第几个结点:\n");
scanf("%d",&i);
getchar();
DelList(LA,i,e);
printf("被删除的元素是%c\n",e);
Print(LA);
printf("此时单链表的长度为%d\n",ListLength(LA));
printf("你要查找取值为多少的元素:\n");
scanf("%c",&e);
p=Locate(LA,e);
printf("查找的元素是%c\n",p->data);
CreatFromTail(LB);
Print(LB);
return 0;
}
数据结构-线性表的链式表示--单链表的基本操作(初始化;销毁;头插法,尾插法创建;按序号,按值查找;求长度;插入;删除;合并;打印)(带注解)
最新推荐文章于 2025-04-01 11:42:34 发布