怎么说呢? 这个代码是好久之前学链表时写的,在codeblocks上编译通过了,以前测试过了,现在没测试就直接复制到上面,有什么问题欢迎指正,O(∩_∩)O谢谢
具体代码如下:
#include<bits/stdc++.h>
#define N 1009
using namespace std;
typedef struct Node
{
int data;
struct Node *next;
}Lnode, *LinkList;
void menu()
{
printf("\t\t\t 单链表基本操作\n\n");
printf("\t\t\t1.建 立 单 链 表\n");
printf("\t\t\t2.遍 历 单 链 表\n");
printf("\t\t\t3.计 算 链 表 长 度\n");
printf("\t\t\t4.链 表 逆 置\n");
printf("\t\t\t5.删 除 偶 数 节 点\n");
printf("\t\t\t6.生 成 值 有 序 单 链 表\n");
printf("\t\t\t7.合 并 生 成 降 序 链 表\n");
printf("\t\t\t8.合 并 生 成 升 序 链 表\n");
printf("\t\t\t9.分 解 链 表\n");
printf("\t\t\t0.退 出\n\n");
}
/*初始化空表*/
bool Init_Linklist(LinkList &L)
{
L=(LinkList)malloc(sizeof(Lnode));
if(!L) return false;
L->next=NULL;
return true;
}
/*尾插法建立单链表*/
bool Creat_Linklist(LinkList &L)
{
int x;
LinkList p,rear;
Init_Linklist(L);
rear = L;
printf("输入-1表示输入结束\n");
while(scanf("%d",&x),x != -1)
{
p = (LinkList)malloc(sizeof(Lnode));
if(!p) return false;
p->data = x;
rear->next = p;
rear = p;
}
rear->next = NULL;
return true;
}
/*单链表遍历*/
void Disp_Linklist(LinkList L)
{
LinkList p;
p = L->next;
while(p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
/*计算单链表长度*/
int length_Linklist(LinkList L)
{
int count = 0; /*count表示单链表长度*/
LinkList p;
p = L->next;
while(p)
{
count++;
p = p->next;
}
return count;
}
/*单链表逆置*/
void Reverse_Linklist(LinkList L)
{
LinkList p, q, tm;
p = L->next;
q = p->next;
if(!q) return ;
p->next = NULL;
while(q)
{
tm = q->next;
q->next = p;
p = q;
if(!tm) break;
q = tm;
}
L->next = q;
}
/*删除值为偶数的结点*/
void DelEven_Linklist(LinkList L)
{
LinkList p, q;
p = L;
q = p->next;
while(q)
{
if(!(q->data&1))
{
p->next = q->next;
free(q);
q = p->next;
continue;
}
p = q;
q = q->next;
}
}
/*在有序单链表中插入元素,链表仍然有序,插入成功返回true,插入失败返回false*/
bool Insert_Linklist(LinkList L, int x)
{
LinkList p, q;
p = L;
q = p->next;
while(q)
{
if(q->data > x)
{
LinkList s = (LinkList)malloc(sizeof(Lnode));
s->data = x;
s->next = q;
p->next = s;
return true;
}
p = q;
q = q->next;
}
LinkList s = (LinkList)malloc(sizeof(Lnode));
s->data = x;
s->next = NULL;
p->next = s;
return true;
}
/*创建非递减有序单链表,创建成功返回true,创建失败返回false*/
bool CreatOrder_Linklist(LinkList &L)
{
int x;
printf("请输入有序链表,以文件尾结尾\n");
Init_Linklist(L);
while(~scanf("%d", &x)) Insert_Linklist(L, x);
return true;
}
/*两个非递减有序单链表La和Lb合并成一个非递增有序链表Lc*/
void MergeDescend_Linklist(LinkList La, LinkList Lb, LinkList &Lc)
{
LinkList a, b, c, cur;
a = La->next;
b = Lb->next;
c = Lc = La;
c->next = NULL;
while(a&&b)
{
if(a->data > b->data)
{
cur = b->next;
b->next = c->next;
c->next = b;
b = cur;
continue;
}
cur = a->next;
a->next = c->next;
c->next = a;
a = cur;
}
while(a)
{
cur = a->next;
a->next = c->next;
c->next = a;
a = cur;
}
while(b)
{
cur = b->next;
b->next = c->next;
c->next = b;
b = cur;
}
}
/*两个非递减有序单链表La和Lb合并成一个非递减有序链表Lc*/
void MergeAscend_Linklist(LinkList La, LinkList Lb, LinkList &Lc)
{
LinkList pa, pb, pc;
pa = La->next;
pb = Lb->next;
pc = Lc = La;
while(pa && pb)
{
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);
}
/*链表La按值分解成两个链表,La全部为奇数,Lb全部为偶数*/
void Split_Linklist(LinkList La, LinkList &Lb)
{
LinkList p, q, b;
p = La;
q = p->next;
b = Lb = La;
while(q)
{
if(q->data&1) continue;
b->next = q;
b = q;
p->next = q->next;
q = q->next;
}
}
int main()
{
int choice, length;
LinkList L, La, Lb, Lc;
while(1)
{
menu();
printf("选择你的操作:");
scanf("%d",&choice);
switch(choice)
{
case 1:
if(Creat_Linklist(L))
printf("单链表创建成功\n");
else
printf("单链表创建失败\n");
break;
case 2:
Disp_Linklist(L);
break;
case 3:
length = length_Linklist(L);
printf("单链表长度为:%d\n",length);
break;
case 4:
Reverse_Linklist(L);
printf("逆置后的链表为:\n");
Disp_Linklist(L);
break;
case 5:
DelEven_Linklist(L);
printf("新链表为:\n");
Disp_Linklist(L);
break;
case 6:
if(CreatOrder_Linklist(L))
{
printf("值有序链表为:\n");
Disp_Linklist(L);
}
else
printf("单链表创建失败\n");
break;
case 7:
CreatOrder_Linklist(La);
CreatOrder_Linklist(Lb);
MergeDescend_Linklist(La, Lb, Lc);
printf("合并后的新链表为:\n");
Disp_Linklist(Lc);
break;
case 8:
CreatOrder_Linklist(La);
CreatOrder_Linklist(Lb);
MergeAscend_Linklist(La, Lb, Lc);
printf("合并后的新链表为:\n");
Disp_Linklist(Lc);
break;
case 9:
Creat_Linklist(L);
Split_Linklist(L, Lb);
printf("分裂后的新链表为:\n");
Disp_Linklist(L);
Disp_Linklist(Lb);
break;
case 0:
return 0;
default:
printf("输入错误,请重新输入\n");
}
}
}