数据结构 单链表

#include<iostream.h>

#define null 0;

#define OK 1;

#define ERROR 0;

typedef int Status;

typedef struct Node{//定义单链表存储结构

int data;

struct Node *next;

}Node,*LinkList;



Status lnitList(LinkList &L)//初始化单链表

{

L=new Node;

L->next=null;

return OK;

}

bool ListEmpty(LinkList &L)//判空

{

if(L->next) return false;

else

return true;

}

Status CreatListTail(LinkList &L, int n){//尾插法

    

    LinkList p,r;

    int i;

    r = L;    

    for (i = 0; i < n; i++) {

        

        p = new Node;

        cin>>p->data;

p->next=null;

        r->next = p;

        r = p;

    }

    

    r->next = NULL;

return OK;

}

Status CreatListHead(LinkList &L, int n){//头插法


    LinkList p;

    int i;

    

    for (i = 0; i < n; i++) {

        

        p = new Node; // 生成新节点

        cin>>p->data;

        p->next = L->next;

        L->next = p;

        

    }

return OK;

}

void PrintList(LinkList L)//输出

{

LinkList p;

p=L->next;

while(p)

{

cout<<p->data<<" ";

p=p->next;

}

cout<<endl;

}


//取值

Status GetElem(LinkList L, int i){

    int e;

    int j;

    LinkList p;  // 声明指针p

    

    p = L->next;  // p指向链表L的第一个结点

    j = 1;      // 当前位置计数器设置为1

    

    while (p && j<i) {  // 当p不为空 切j<i时候 j继续向后找

        

        p = p->next;

        j++;

    }

    

    if (!p || j>i) return ERROR;  // 到达结尾且没找到

    

    e = p->data;  // 获取倒找的结果

    

    return e;

}



//插入

Status ListInsert(LinkList &L, int i, int e){

    

    int j;

    LinkList p,s;

    

    p = L;

    j = 1;

    

    while (p && j<i) {  // 用于寻找第i个结点

        

        p = p->next;

        j++;

    }

    

    if (!p || j>i) return ERROR;  // 到达结尾且没找到

    

    s = new Node;  //生成一个空节点s

    

    // 插入语句

s->data=e;

    s->next = p->next;

    p->next = s;

    

    return OK;

}



//删除

Status ListDelete(LinkList &L, int i){

    

    int j;

    LinkList p,q;

    

    p = L;

    j = 1;

    

    while (p && j<i) {  // 用于寻找第i个结点

        

        p = p->next;

        j++;

    }

    

    if (!p || j>i) return ERROR;  // 到达结尾且没找到

    

    q = p->next;

    

    // 删除语句

    p->next = q->next;

    delete q;

    

    return OK;

}


void ClearList(LinkList &L){


    LinkList p;

    

    while (L->next) {

        p=L->next;

L->next=p->next;

        delete p;

    }

}


//销毁

void DestroyList(LinkList &L)

{

LinkList p;

while(L)

{

p=L;

L=L->next;

delete p;

}

}

//表长

int LisLength(LinkList L)

{

int count=0;

LinkList p;

p=L->next;

while(p)

{

count++;

p=p->next;

}

return count;

}

//返回位序

int LocalteElem(LinkList L,int e)

{

LinkList p;

p=L->next;

int i=1;

while(p&&p->data!=e)

{

p=p->next;i++;

}

return i;

}

void InversionList(LinkList &L){//逆置

Node *p,*q;

p=L->next;

L->next=null;

while(p){

q=p->next;

p->next=L->next;

L->next=p;

p=q;

}

}


void main()

{

LinkList L;

lnitList(L);

cout<<"20-8软工2-9-115"<<endl;

if(ListEmpty(L))cout<<"初始化单链表"<<endl;

cout<<"输入预计元素个数"<<endl;

int i,j,x;;

cin>>i;

cout<<"---创建单链表---"<<endl;

cout<<"---1.头插法---"<<endl;

cout<<"---2.尾插法---"<<endl;

cin>>j;

switch(j)

{

case 1:CreatListHead(L,i);break;

case 2:CreatListTail(L,i);break;

}

cout<<"输出表:";PrintList(L);

cout<<"表长为"<<LisLength(L)<<endl;

bool one=1;

while(one){

cout<<endl;

cout<<"请输入将要进行的操作"<<endl;

cout<<"1.删除表中元素"<<endl;

cout<<"2.往表中插入元素"<<endl;

cout<<"3.读取表中第i个元素"<<endl;

cout<<"4.按值查找"<<endl;

cout<<"5.进行逆置运算"<<endl;

cout<<"6.退出"<<endl;

cin>>j;

switch(j)

{

case 1:cout<<"删除第几个元素?";

cin>>i;ListDelete(L,i);cout<<"输出表:";PrintList(L);

cout<<"表长为"<<LisLength(L)<<endl;break;

case 2:cout<<"第几个位置插入?";

cin>>i;

cout<<"插入的元素为?";

cin>>x;ListInsert(L,i,x);cout<<"输出表:";PrintList(L);

cout<<"表长为"<<LisLength(L)<<endl;break;

case 3:cout<<"查找第几个";cin>>i;

cout<<"第"<<i<<"个元素的值为"<<GetElem(L,i)<<endl;break;

case 4:cout<<"要查找的元素的值为?";cin>>x;

cout<<x<<"在表中的位序为"<<LocalteElem(L,x)<<endl;break;

case 5:InversionList(L);cout<<"输出表:";PrintList(L);

cout<<"表长为"<<LisLength(L)<<endl;break;

case 6:one=0;break;

}

}


ClearList(L);

cout<<"清空后,表长为:"<<LisLength(L)<<endl;

DestroyList(L);

}

 

posted @ 2022-07-19 09:04  霖霖的信箱  阅读(145)  评论(0)    收藏  举报