typedef int status
#define OVERFLOW -2
#define OK 1
#define ERROR -1
#include "stdio.h"
#include "stdlib.h"
typedef struct LNode {
Elemtype data
struct LNode *next
}*linklist
//构造链表
void Create_Linklist(linklist &L)
{
linklist p
p=(linklist)malloc(sizeof(LNode))
if(!p)
exit(OVERFLOW)
L=p
L->next =NULL
}
//节点插入
void Insert_Linklist(linklist &L)
{
linklist p
int n,i
printf("请输入插入节点的个数n: ")
scanf("%d",&n)
getchar()
for(i=ni>0i--)
{
p=(linklist )malloc(sizeof(LNode))
scanf("%d",&p->data)
p->next=L->next
L->next =p
}
}
//遍历输出并输出长度
status Visit_linklist(linklist &L)
{
linklist p
int i=1
p=L->next
if(L->next==NULL)
return ERROR
while(p->next !=NULL)
{
printf("%d ",p->data )
p=p->next
i++
}
printf("%d\n",p->data )
printf("长度为:%d\n",i)
return OK
}
//查找值为x的直接前驱结点q并输出
void Search_linklist(linklist &L)
{
int x,k=0
linklist p=L,q
printf("输入x: ")
scanf("%d",&x)
getchar()
if(L->next ==NULL)
printf("该表为空 !\n")
while(p->next!=NULL)
{
q=p
if(p->next ->data ==x)
{
printf("%d ",q->data )
k=1
}
p=p->next
}
if(p->next &&p->data ==x)
{
printf("%d ",p->data )
k=1
}
if(k==0)
printf("未找到值为%d的结点\n",&x)
printf("\n")
}
//删除节点
status Delete_linklist(linklist &L)
{
linklist p,q
int k=0,x
printf("请输入删除节点的值x: ")
scanf("%d",&x)
getchar()
if(L->next ==NULL)
return ERROR
p=L
q=L->next
while(q!=NULL)
if(q->data ==x)
{
k=1
p=q
p->next =q->next
free(q)
q=p->next
}
else
{
p=q
q=p->next
}
if(k==0)
printf("表中没有值为%d的结点!\n",&x)
return OK
}
//链表逆置
void ListInverse_linkliast(linklist &L)
{
linklist k,p,q
p=L
while (p->next !=NULL)
{
p=p->next
}
k=p
while (L->next !=p)
{
q=L->next
L->next = q->next
k->next =q
}
}
//链表奇偶分解
void Break_linklist (linklist &La,linklist &Lb)
{
linklist p,q
p=La->next
q=Lb
while(p->next!=NULL)
{
if(p->data %2==0)
{
q->next =p
q=q->next
}
p=p->next
}
if(p->data %2==0)
{
q->next =p
q=q->next
}
}
//主菜单
void main()
{
linklist L1,L2
printf(" (1) 建立带头节点的单链表\n")
printf(" (2) 插入节点\n")
printf(" (3) 计算链表长度并输出单链表\n")
printf(" (4) 查找值为x的直接前驱结点并输出其值\n")
printf(" (5) 删除节点值为x的结点\n")
printf(" (6) 逆置单链表结点\n")
printf(" (7) 单链表奇偶分解\n")
int choice
printf(" 请输入选择:")
while(scanf("%d",&choice))
{
getchar()
printf("\n\n")
switch(choice)
{
case 1:
Create_Linklist(L1)
break
case 2:
Insert_Linklist(L1)
break
case 3:
Visit_linklist(L1)
break
case 4:
Search_linklist(L1)
break
case 5:
Delete_linklist(L1)
break
case 6:
ListInverse_linkliast(L1)
break
case 7:
Create_Linklist(L2)
Break_linklist (L1,L2)
break
default:
printf(" 输入有误!")
break
}
}
}
#include <iostream.h>#include <iomanip.h>
#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
//定义结点类型
struct Node{
int data
Node *next
}
Node Head //头结点
Node *DLList //头指针
void init(Node *DLList)
void display(Node *DLList)
void insert(Node *DLList)
void search(Node *DLList)
void del(Node *DLList)
void nzlist(Node *DLList)
void main()
{
char choice
DLList=&Head//使头指针指向头结点
Head.next=NULL
while (1)
{
system("cls")
cout <<"\n\n\n\n"
cout <<"\t\t 单链表操作 \n"
cout <<"\t\t===================================="
cout <<"\n\n"
cout <<"\t\t 1:初始化 \n"
cout <<"\t\t 2:显示\n"
cout <<"\t\t 3:单个插入\n"
cout <<"\t\t 4:查找\n"
cout <<"\t\t 5:删除\n"
cout <<"\t\t a:逆置\n"
cout <<"\t\t 0:退出\n"
cout <<"\n"
cout <<"\t\t请选择:" <<flush
choice = getch()
system("cls")
switch(choice)
{
case '1':
init(DLList)
break
case '2':
display(DLList)
break
case '3':
insert(DLList)
break
case '4':
search(DLList)
break
case '5':
del(DLList)
break
case 'a':
nzlist(DLList)
break
case '0':
exit(0)
}
}
}
//公用的等待函数
void wait()
{
cout <<"\n\n请按任意键继续" <<flush
getch()
}
//屏幕提示后,从键盘输入线性表长度和随机数种子,生成以DLList为头指针的指定长度的线性表
void init(Node *DLList)
{
int length
Node *p,*q
while (1)
{
cout <<"输入元素个数(0-" <<10000 <<"):" <<flush
cin >>length
if (length >= 0 &&length <= 10000)
break
cout <<endl
}
int i
while (1)
{
cout <<"输入随机数种子(0-32767):" <<flush
cin >>i
if (i >= 0 &&i <= 32767)
break
cout <<endl
}
//从线性表中删除并释放原有的结点,使其成为空表
p=DLList
while (p->next!=NULL)
{
q=p->next
p->next=q->next
free(q)
}
srand(i) //指定随机数种子,相同的种子将产生相同的数据序列
rand()
//向线性表插入length个新结点
for (int j=1j<=lengthj++)
{
p=new Node
p->next=DLList->next
DLList->next=p
p->data=rand() % 10000
}
}
//在屏幕上依次显示以DLList为头指针的线性表中的全部元素和元素个数
//格式应便于观察
//如果需要指定输出的宽度,可以使用 cout <<setw(W) <<X ,其中 X 是输出的数值,W 是占据的列数
void display(Node *DLList)
{
Node *x=DLList->next
int j=0
while(x)
{
cout<<" "<<x->data
x=x->next
if(j%10==9)
cout<<endl
j++
}
cout<<"一共有"<<j<<"个元素"<<endl
wait()
}
//屏幕提示后,从键盘输入一个元素值,然后把这个新元素插到以DLList为头指针的线性表的末尾
void insert(Node *DLList)
{
int j
cout<<"插入的值是:"<<endl
cin>>j
Node *x=DLList->next,*y
while(x->next)
x=x->next
y=(Node *)malloc(sizeof(Node))
y->data=j
y->next=x->next
x->next=y
}
//屏幕提示后,从键盘输入一个元素值,在以DLList为头指针的线性表中搜索这个元素
void search(Node *DLList)
{
int j
Node *a=DLList->next
cout<<"需要搜索的值是:"<<endl
cin>>j
while(a&&a->data!=j)
{
a=a->next
}
if(a)
{
cout<<"找到了该值:"<<a->data<<endl
}
else
cout<<"表中没有该元素"<<endl
wait()
}
//屏幕提示后,从键盘输入一个元素值,在以DLList为头指针的线性表中删除这个元素
//屏幕显示删除成功与否的信息
void del(Node *DLList)
{
int j
Node *a=DLList
cout<<"需要删除的值是:"<<endl
cin>>j
while(a->next &&a->next->data!=j)
a=a->next
if(a->next)
{
a->next=a->next->next
cout<<"all right"<<endl
}
else
cout<<"sorry,failed"<<endl
wait()
}
//应用题
/*
6、将链接存储线性表逆置,即最后一个结点变成第1个结点,原来倒数第2个结点变成第2个结点,如此等等。*/
void nzlist(Node *DLList)
{
Node *p,*q,*s
q= DLList
p= DLList->next
q->next=NULL
while(p)
{
s=p->next
p->next=q->next
q->next=p
p=s
}
while(q)
{
cout<<""<<q->data
q=q->next
cout<<endl
}
wait()
}
只能做到这儿了。其他两道题有点麻烦,我也不确定做的是否正确。就不发了