//不带头结点
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}LNode,*LinkList;
void InitList(LinkList &l);
void Create_head(LinkList &l);
void Create_rear(LinkList &l);
void Output(LinkList &l);
LNode *Pos(LinkList &l,int i);
void DelList(LinkList &l,int i,ElemType &e);
void InsertList(LinkList &l,int i,ElemType e);
LNode *Get(LinkList &l,ElemType key);
LinkList MergeList(LinkList &La,LinkList &Lb);
int ListLength(LinkList l);
void ShowMenu()
{
printf("——————————————————————————————\n");
printf("1、初始化一个单链表\n");
printf("2、用头插法建立一个单链表\n");
printf("3、用尾插法建立一个单链表\n");
printf("4、输出该顺序表\n");
printf("5、求该单链表的长度\n");
printf("6、向该顺序表插入元素\n");
printf("7、对该顺序表删除元素\n");
printf("8、按值查找\n");
printf("9、按位置查找\n");
printf("10、合并两个单链表\n");
printf("0、退出\n");
printf("——————————————————————————————\n");
}
int main()
{
ShowMenu();
int n;
LinkList l;
while(1)
{
printf("请输入你要操作的元素序号:");
scanf("%d",&n);
switch(n)
{
case 1:
{
InitList(l);
break;
}
case 2:
{
printf("请依次输入数据,并以-1作为结束标记:\n");
Create_head(l);
break;
}
case 3:
{
printf("请依次输入数据,并以-1作为结束标记:\n");
Create_rear(l);
break;
}
case 4:
{
Output(l);
break;
}
case 5:
{
printf("len:%d\n",ListLength(l));
break;
}
case 6:
{
printf("Insert----------------------\n");
int m,i;
printf("请依次输入你要插入的位置和元素:");
scanf("%d %d",&i,&m);
InsertList(l,i,m);
printf("插入以后该链表的元素依次为:\n");
Output(l);
break;
}
case 7:
{
printf("Del--------------\n");
ElemType e;
int j;
printf("请依次输入你要删除的位置:");
scanf("%d",&j);
DelList(l,j,e);
break;
}
case 8:
{
printf("请输入你要查找的值:");
int i;
scanf("%d",&i);
LNode *q = Get(l,i);
if(q->next)
printf("该值的下一个位置的值为:%d\n",q->next->data);
else
printf("该值无下一位\n");
break;
}
case 9:
{
printf("请输入你要查找的位置:");
int k;
scanf("%d",&k);
LNode *q = Pos(l,k);
printf("该位置的值为:%d\n",q->data);
break;
}
case 10:
{
printf("Merge-----------------\n");
LinkList l1,l2;
InitList(l1);
InitList(l2);
printf("利用尾插法建立两个有序单链表:\n");
Create_rear(l1);
Create_rear(l2);
LNode *p = MergeList(l1,l2);
printf("输出合并以后的链表:");
Output(p);
break;
}
case 0:{
exit(0);
break;
}
default:{
printf("非法的数字序号!\n");
}
}
}
return 0;
}
void InitList(LinkList &l)
{
l = NULL;
}
void Create_rear(LinkList &l)
{
int m;
LNode *p = NULL;
while(1)
{
scanf("%d",&m);
if(m==-1) break;
LNode *s= new LNode;
s->data = m;
s->next = NULL;
if(p)
{
p->next = s;
//p = p->next;
}
else
{
l=s;
//p = s;
}
p = s;
}
}
void Create_head(LinkList &l)
{
int m;
while(1)
{
scanf("%d",&m);
if(m==-1) break;
LNode *s= new LNode;
s->data = m;
s->next = l;
l = s;
}
}
LNode *Pos(LinkList &l,int i)
{
if(i<0)
{
printf("非法的寻找位置!\n");
return NULL;
}
LNode *p = l;
while(--i)
{
p = p->next;
if(p==NULL)
{
printf("寻找位置已超过链表长度\n");
break;
}
}
return p;
}
void DelList(LinkList &l,int i,ElemType &e)
{
LNode *p,*q=NULL;
p = Pos(l,i-1);
if(p==l)
{
l= p->next;
delete p;
}
if(p!=NULL && p->next!=NULL)
{
q = p->next;
p->next = q->next;
delete q;
}
}
void InsertList(LinkList &l,int i,ElemType e)
{
LNode *p,*s;
s = new LNode;
s->data = e;
if(i==1)
{
s->next = l;
l = s;
}
else
{
p = Pos(l,i-1);
s->next = p->next;
p->next = s;
}
}
LNode *Get(LinkList &l,ElemType key)
{
Node *p;
p = l;
while(p)
{
if(p->data != key)
p = p->next;
else
break;
}
return p;
}
int ListLength(LinkList l)
{
LNode *p = l;
int len=0;
while(p)
{
len++;
p = p->next;
}
return len;
}
LinkList MergeList(LinkList &La,LinkList &Lb)
{
LNode *pa,*pb;
LinkList Lc;
pa = La;
pb = Lb;
Lc = NULL;
if(La->data <= Lb->data)
{
Lc = La;
pa = pa->next;
}
else
{
Lc = Lb;
pb = pb->next;
}
LNode *r = Lc; //尾指针
while(pa &&pb)
{
if(pa->data<=pb->data)
{
r->next = pa;
//r = pa;
pa = pa->next;
}
else
{
r->next = pb;
//r = pb;
pb = pb->next;
}
r = r->next;
r->next = NULL;
}
if(pa)
r->next = pa;
else
r->next = pb;
return Lc;
}
void Output(LinkList &l)
{
LNode *p;
p=l;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
单链表(不带头结点)
最新推荐文章于 2025-03-07 21:28:41 发布