单链表
头插和尾插
初始化 头节点指针域fu空
单链表的查找:
F10 zhuguocheng
F9 断点
F11zhu语句
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
//单链表存储结构
#define Status int
#define True 1
#define False 0
#define MAXSIZE 20
typedef int ElemType; //线性表数据类型
//对于每个单链表来说,它所占的空间的大小和位置不需要预先分配划定
typedef struct Node
{
int data; //数据域
struct Node *next; //指针域
}LNode,*LinkList;
//typedef struct Node *LinkList;
//单链表的创建有两种方法,分别是头插法和尾插法
//算法思路:
//创建工作指针p,尾指针L,头指针h
//初始化h的数据域和链域
//用h给L的链域赋值,以此来初始化L
//将数据写入p的数据域
//将p与L前一个结点链接(p->h)
//将L与前一个结点的链接断开,将L与p链接,以此来更新结点
//头插法
//LinkList creat(int n)
//{
// LinkList p, L,h; //p为工作指针,L为尾指针,h为头指针
// L = (LinkList)malloc(sizeof(Node));
// h = (LinkList)malloc(sizeof(Node)); //为L,h分配内存
// h->data = 0;
// h->Next = NULL;
//
// L->Next = h; //初始化L
// for (int i = 0; i < n; i++)
// {
// if ((p = (LinkList)malloc(sizeof(Node))) == NULL)
// {
// printf("不能分配空间!");
// exit(0);
// }
// printf("第%d个结点的数据域:", i + 1);
// scanf("%d", &p->data);
// p->Next = L->Next; //将p与L前一个结点链接
// L->Next = p; //将L与前一个结点的链接断开,将L与p链接
// }
// return L;
//}
LinkList CreatList2()
{ LinkList pL;
int i,n=0,e;
LinkList p;
srand(time(0));
pL=(LinkList)malloc(sizeof(LNode));
if(!pL) exit(-1);
pL->next=NULL;
printf("请输入单链表a的长度:\n");
scanf(" %d",&n);
for(i=1;i<n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
if(!p) exit(-1);
p->data=rand()%100+1;
p->next=pL->next ;
pL->next=p;
}
return pL;
}
//尾插法
//LinkList creat(int n) //链表的初始化
//{
// LinkList p, h, s; /* *h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点*/
// int i; //计数器
// if ((h = (LinkList)malloc(sizeof(Node))) == NULL)
// {
// printf("不能分配内存空间\n");
// exit(0);
// }
// h->data = n; //表头结点数据域初始化为表长
// h->Next = NULL; //表头结点的链域置空
// p = h; //p指向表头结点
// for (i = 0; i < n; i++)
// {
// if ((s = (LinkList)malloc(sizeof(Node))) == NULL) //分配新存储空间并检测,中介指针的创建
// {
// printf("不能分配内存空间\n");
// exit(0);
// }
// p->Next = s; //将s的地址赋值给p所指向结点的链域,将p与s链接起来
// printf("第%d个结点的数据域:", i + 1);
// scanf("%d",&s->data); //将数据存入当前节点的数据域
// s->Next = NULL;
// p = s; //结点的更新
// }
// p->Next = NULL;
// return h; //返回链表的头指针
//}
LinkList TCreatList2()
{ LinkList pL;
int n,e,i;
LinkList p,q;
p=pL=(LinkList)malloc(sizeof(LNode));
if(!pL) exit(-1);
pL->next =NULL;
printf("请输入单链表A的长度:\n");
scanf(" %d",&n);
for(i=1;i<n;i++)
{
q=(LinkList)malloc(sizeof(LNode));
if(!q) exit(-1);
printf("请输第%d个数据元素?:\n",i);
scanf(" %d",&e);
q->data=e;
q->next=p->next ;
p->next =q;
p=q;
}
return pL;
}
//打印单链表
Status PrintList(LinkList pL){
LinkList p;
p=pL->next;
if(!p){
printf("单链表为空\n");
return False;
}
printf("单链表为:\n");
while(p!=NULL){
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
return True;
}
//按序号查找
Status Get_Elem(LinkList pL,int i)
{
int j;
LinkList p;
p=pL->next ;
j=1;
while(j<1 && p!=NULL)
{
p=p->next ;
j++;
}
if(j>1||!p)
{
printf("没有找到\n");
return False;
}
printf("查找位置%d的元素为%d! \n",i,p->data);
return True;
}
//按数值查找
Status Locate_Node(LinkList pL,ElemType e)
{
int j=1;
LinkList p;
p=pL->next ;
while(p&&p->data !=e)
{
p=p->next ;
j++;
}
if(!p)
{ printf("查找的元素%d不在单链表A中\n",e);
return False;
}
else
{
printf("查找的元素%d最早出现在%d的位置 \n",e,j );
return True;
}
}
//插入
Status ListInsert(LinkList pL,int i,ElemType e)
{
LinkList p=pL,s;
int j=0;
while(p && j<i-1)
{
p=p->next;
j++;
}
if(!p || j>i-1)
{ printf("插入位置不合理,无法插入\n");
return False;
}
s=(LinkList) malloc(sizeof(LNode));
s->data =e;
s->next =p->next ;
p->next =s;
return True;
}
//删除——按序号
//Status Delete_Elem(LinkList pL,int i){
// LinkList p=pL,q;
// int j=0;
// ElemType e;
// while(j<i-1&&p->Next!=NULL){
// p=p->Next;
// j++;
//
// }
// if(j<i-1||!p->Next){
// printf("删除位置不合理!\n");
// return False;
// }
// q=p->Next;
// e=q->data;
// p->Next=q->Next;
// free(q);
// printf("删除第%d个,数据元素%d\n",i,e);
// return True;
//
//}
//删除——按序号
Status Delete_Elem(LinkList pL,int i)
{
LinkList p=pL,q;
int j=0;
ElemType e;
while(j<i-1 && p->next !=NULL)
{
p=p->next;
j++;
}
if(j<i-1 ||!p->next )
{
printf("删除位置不合理\n");
return False;
}
q=p->next;
e=q->data;
p->next =q->next ;
free(q);
printf("删除第%d个元素%d\n",i,e);
return True;
}
//删除——按数值
Status Delete_Node(LinkList pL,ElemType e)
{
LinkList q=pL->next ,p=pL;
while(q->data !=e && q)
{
p=q;
q=q->next ;
}
if(q->data !=e )
{ printf("未找到数据\n");
return False;
}
p->next =q->next ;
free(q);
return True;
}
//拓展
Status Delete_All_Node(LinkList pL,ElemType e)
{
LinkList q=pL->next ,p=pL;
while(q)
{
if(q->data==e)
{p->next =q->next ;
free(q);
q=p->next;
}
else{
p=q;
q=q->next;
}
}
return True;
}
LinkList Combine(LinkList La,LinkList Lb)
{
LinkList Lc=La;
LinkList pa=La->next,pb=Lb->next ,pc=Lc;
while(pa!=NULL &&pb!=NULL)
{
if(pa->data < pb->data )
{
pc->next =pa;
pc=pa;
pa=pa->next ;
}
else
{
pc->next =pb;
pc=pb;
pb=pb->next ;
}
}
pc->next =pa?pa:pb;
free(Lb);
return Lc;
}
int main()
{
LinkList L=NULL,La,Lb,Lc;
int i,e=0;
int choice=0;
char select;
do
{
printf("************单链表操作*************\n");
printf("************1------创建************\n");
printf("************2------查询************\n");
printf("************3------插入************\n");
printf("************4------删除************\n");
printf("************5------归并************\n");
printf("************0------退出************\n");
printf("**************** ******************\n");
printf("请选择想要的操作(0-5):\n");
scanf(" %d",&choice);
switch(choice)
{
case 1:
printf("请选择插入的方法\n");
scanf(" %c",&select);
switch(select)
{
case 'A':L=CreatList2(); break;
case 'B':L=TCreatList2(); break;
default: printf("只能输入A和B!\n");break;
}
PrintList(L);
break;
case 2:
printf("请选择查询方法:A按序号查找,B按数值查找\n");
scanf(" %c",&select);
switch(select)
{
case 'A':
printf("请输入要查询元素的序号\n");
scanf(" %d",&i);
Get_Elem(L,i);
break;
case 'B':
printf("请输入要查找元素的数值\n");
scanf(" %d",&e);
Locate_Node(L,e);
break;
default: printf("只能输入A和B\n");break;
}
break;
case 3:
printf("要输入的数据为n");
scanf(" %d",&e);
printf("要插入的位置为\n");
scanf(" %d",&i);
if(ListInsert(L,i,e))
{ printf("插入成功\n");
PrintList(L);}
break;
case 4:
printf("请选择查询方法:A按序号删除,B按数值查找\\n");
scanf(" %c",&select);
switch(select)
{ case 'A':
printf("请输入要删除元素的序号\n");
scanf(" %d",&i);
Delete_Elem(L,i);
PrintList(L);
break;
case 'B':
printf("请输入要查找元素的数值\n");
scanf(" %d",&e);
Delete_Node(L,e);
PrintList(L);
break;
case 'C':
printf("请输入要查找元素的数值\n");
scanf(" %d",&e);
Delete_All_Node(L,e);
PrintList(L);
break;
default: printf("只能输入A-C\n");break;
}
break;
case 5:
La=TCreatList2();
PrintList(La);
Lb=TCreatList2();
PrintList(Lb);
Lc=Combine(La,Lb);
PrintList(Lc);
break;
case 0:
printf("退出\n");
break;
default:printf("重新输入\n");
break;
}
}while(choice);
}