编写一个完整的程序,实现单链表的建立、插入、删除、输出等基本操作。

JavaScript021

编写一个完整的程序,实现单链表的建立、插入、删除、输出等基本操作。,第1张

typedef int Elemtype

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()

}

只能做到这儿了。其他两道题有点麻烦,我也不确定做的是否正确。就不发了