链表

来源:互联网 发布:linux防篡改 编辑:程序博客网 时间:2024/06/15 10:30
#include<iostream>#include<malloc.h>typedef char ElemType;typedef int Status;#define OK 1#define ERROR 0using namespace std;typedef struct LNode{    ElemType data;    LNode *next;} LNode, *LinkList;void about()  //版本信息{    cout << "单链表的操作"<<endl;}void showmenu()  //功能列表{    cout << endl << " **********功能**********" << endl         << " * 1.输出单链表的全部数据*" << endl         << " * 2.查找链表元素 *" << endl         << " * 3.链表插入元素 *" << endl         << " * 4.链表删除元素 *" << endl         << " * 5.结束 *" << endl         << " ************************" << endl         << "请输入所需功能: ";}//*******查看输入的全部数据*********void PrintList(LinkList L){    LinkList p;    cout << endl << "你输入的数据为: ";    p = L->next; //从头结点开始扫描    while(p)  //顺指针向后扫描,直到p->next为NULL或i=j为止    {        cout << p->data;        cout<<" ";        p = p->next;    }    cout << endl;}//逆序输入 n 个数据元素,建立带头结点的单链表void CreateList_L(LinkList &L, int n){    int i;    LinkList p;    L = new LNode;    L->next = NULL; // 先建立一个带头结点的单链表    cout << "逆序输入 n 个数据元素,建立带头结点的单链表" << endl;    for(i = n; i > 0; --i)    {        p = new LNode;        cin >> p->data; // 输入元素值        p->next = L->next;        L->next = p; // 插入    }}// L是带头结点的链表的头指针,以 e 返回第 i 个元素Status GetElem_L(LinkList L, int i, ElemType &e){    int j;    LinkList p;    p = L->next;    j = 1; // p指向第一个结点,j为计数器    while(p && j < i)    {        p = p->next;    // 顺指针向后查找,直到 p 指向第 i 个元素或 p 为空        ++j;    }    if(!p || j > i)        return ERROR; // 第 i 个元素不存在    e = p->data; // 取得第 i 个元素    return OK;}// 本算法在链表中第i 个结点之前插入新的元素 eStatus ListInsert_L(LinkList L, int i, ElemType e){    int j;    LinkList p, s;    p = L;    j = 0;    while(p && j < i - 1)    {        p = p->next;    // 寻找第 i-1 个结点        ++j;    }    if(!p || j > i - 1)        return ERROR; // i 大于表长或者小于1    s = new LNode; // 生成新结点    if(s == NULL) return ERROR;    s->data = e;    s->next = p->next;    p->next = s; // 插入    return OK;}Status ListDelete_L(LinkList L, int i, ElemType &e){    LinkList p, q;    int j;    p = L;    j = 0;    while(p->next && j < i - 1)    {        p = p->next;        ++j;    }// 寻找第 i 个结点,并令 p 指向其前趋    if(!(p->next) || j > i - 1)        return ERROR; // 删除位置不合理    q = p->next;    p->next = q->next; // 删除并释放结点    e = q->data;    free(q);    return OK;}int main(){    LinkList L;    int n, choice, i;    ElemType e;    about();    cout << "请输入链表中元素的个数";    cin >> n;    CreateList_L(L, n);    showmenu(); //功能列表    cin >> choice;    while(choice != 5)    {        //输入时候退出程序        switch(choice)        {            case 1:                PrintList(L);                break; //1.查看输入的全部数据            case 2:                {                    cout << "输入你要查找的元素的位置: ";                    cin >> i;                    GetElem_L(L, i, e);                    cout << "第" << i << "个元素的值是" << e << endl;                    break;                } //2.查找链表元素            case 3:                {                    cout << "请输入你要插入元素的位置i: ";                    cin >> i;                    cout << endl << "请输入你要插入元素的值: ";                    cin >> e;                    ListInsert_L(L, i, e);                    break;                } //3.链表插入元素            case 4:                {                    cout << "请输入你要删除元素的位置";                    cin >> i;                    ListDelete_L(L, i, e) ;                    break;                } //4.链表删除元素            default:                cout << "输入错误,请输入-5,输入重显示功能表^_^ " << endl;        }        cout << endl << "输入功能序号:";        cin >> choice;    }}#include<stdio.h>#include<stdlib.h>typedef int DataType;typedef struct Node{    DataType data;    struct Node *next;} SLNode;void ListInitiate(SLNode * * L){    if((*L=(SLNode *)malloc(sizeof(SLNode)))==NULL)exit(1);    (*L)->next=NULL;}int ListLength(SLNode *L){    SLNode *p=L;    int size=0;    while(p->next!=L)    {        p=p->next;        size++;    }    return size;}int ListInsert(SLNode *L,int i,DataType x){    SLNode *p,*q;    int j;    p=L;    j=0;    while(p->next!=NULL&&j<i-1)    {        p=p->next;        j++;    }    if(j!=i-1)    {        printf("error");        return 0;    }    if((q=(SLNode *)malloc(sizeof(SLNode)))==NULL)exit(1);    q->data=x;    q->next=p->next;    p->next=q;    return 0;}int ListDelete(SLNode *L,int i,DataType *x){    SLNode *p,*s;    int j;    p=L;    j=0;    while(p->next!=NULL&&j<i-1)    {        p=p->next;        j++;    }    if(j!=i-1)    {        printf("error");        return 0;    }    s=p->next;    *x=s->data;    p->next=s->next;    free(s);    return 0;}int ListSearch(SLNode *L,DataType x){    SLNode *p;    int j;    p=L;    j=1;    while(p->next!=NULL)    {        p=p->next;        if(p->data==x)        {            printf("找到,%d在第%d个位置",x,j);            return 0;        }        j++;    }    printf("没有找到%d",x);    return 0;}//逆置void ListReverse(SLNode *L){    SLNode *p,*q,*s;    p=L->next;    q=p->next;    s=NULL;   while(q!=NULL)   {     s=q->next;     q->next=p;     p=q;     q=s;   }   L->next->next=NULL;   L->next=p;}//合并void ListMerger(SLNode *La,SLNode *Lb,SLNode *Lc){    SLNode *pa,*pb,*pc;    pa=La->next;    pb=Lb->next;    Lc=pc=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);}void Destroy(SLNode * *L){    SLNode *p,*p1;    p=*L;    while(p!=NULL)    {        p1=p;        p=p->next;        free(p1);    }    *L=NULL;}int main(void){    SLNode *La,*Lb,*Lc,*p;    int n,m;    int i,x;    ListInitiate(&La);    p=La;    printf("请输入线性表La长度:");    scanf("%d",&n);    printf("请输入线性表La中的元素:");    for(i=1; i<=n; i++)    {        scanf("%d",&x);        ListInsert(La,i,x);    }    printf("请输入要插入到线性表La中的数字x和要插入的位置:");    scanf("%d%d",&x,&i);    ListInsert(La,i,x);    printf("线性表La=");    while(p->next!=NULL)    {        p=p->next;        printf("%d ",p->data);    }    printf("\n请输入要删除的数字的位置:");    scanf("%d",&i);    ListDelete(La,i,&x);    p=La;    printf("线性表La=");    while(p->next!=NULL)    {        p=p->next;        printf("%d ",p->data);    }    printf("\n请输入要查找的数字:");    scanf("%d",&x);    ListSearch(La,x);    ListReverse(La);    p=La;    printf("\n逆置线性表La=");    while(p->next!=NULL)    {         p=p->next;         printf("%d ",p->data);    }    ListInitiate(&Lb);    p=La;    printf("\n请输入线性表Lb长度:");    scanf("%d",&m);    printf("请输入线性表Lb中的元素:");    for(i=1; i<=m; i++)    {        scanf("%d",&x);        ListInsert(Lb,i,x);    }    ListInitiate(&Lc);    ListMerger(La,Lb,Lc);    p=La;    printf("合并La和Lb后的线性表为:");    while(p->next!=NULL)    {        p=p->next;        printf("%d ",p->data);    }    Destroy(&La);   // Destroy(&Lb);    Destroy(&Lc);    return 0;}#include <stdio.h>#include <stdlib.h>typedef int ElemType;//////////////////////////////////////////////定义结点类型typedef struct Node{    ElemType data;                //单链表中的数据域    struct Node *next;            //单链表的指针域}Node,*LinkedList;//////////////////////////////////////////////单链表的初始化LinkedList LinkedListInit(){    Node *L;    L = (Node *)malloc(sizeof(Node));    //申请结点空间    if(L == NULL)                        //判断是否有足够的内存空间        printf("申请内存空间失败/n");    L->next = NULL;                     //将next设置为NULL,初始长度为0的单链表}//////////////////////////////////////////////单链表的建立1,头插法建立单链表LinkedList LinkedListCreatH(){    Node *L;    L = (Node *)malloc(sizeof(Node));    //申请头结点空间    L->next = NULL;                        //初始化一个空链表    ElemType x;                            //x为链表数据域中的数据    while(scanf("%d",&x) != EOF)    {        Node *p;        p = (Node *)malloc(sizeof(Node));    //申请新的结点        p->data = x;                        //结点数据域赋值        p->next = L->next;                    //将结点插入到表头L-->|2|-->|1|-->NULL        L->next = p;    }    return L;}//////////////////////////////////////////////单链表的建立2,尾插法建立单链表LinkedList LinkedListCreatT(){    Node *L;    L = (Node *)malloc(sizeof(Node));    //申请头结点空间    L->next = NULL;                    //初始化一个空链表    Node *r;    r = L;                            //r始终指向终端结点,开始时指向头结点    ElemType x;                            //x为链表数据域中的数据    while(scanf("%d",&x) != EOF)    {        Node *p;        p = (Node *)malloc(sizeof(Node));    //申请新的结点        p->data = x;                        //结点数据域赋值         r->next = p;                    //将结点插入到表头L-->|1|-->|2|-->NULL        r = p;    }    r->next = NULL;    return L;}//////////////////////////////////////////////单链表的插入,在链表的第i个位置插入x的元素LinkedList LinkedListInsert(LinkedList L,int i,ElemType x){    Node *pre;                        //pre为前驱结点    pre = L;    int tempi = 0;    for (tempi = 1; tempi < i; tempi++)         pre = pre->next;                    //查找第i个位置的前驱结点    Node *p;                                //插入的结点为p    p = (Node *)malloc(sizeof(Node));    p->data = x;    p->next = pre->next;    pre->next = p;    return L;}//////////////////////////////////////////////单链表的删除,在链表中删除值为x的元素LinkedList LinkedListDelete(LinkedList L,ElemType x){    Node *p,*pre;                    //pre为前驱结点,p为查找的结点。    p = L->next;    while(p->data != x)                //查找值为x的元素    {        pre = p;        p = p->next;    }    pre->next = p->next;            //删除操作,将其前驱next指向其后继。    free(p);    return L;}/////////////////////////////////////////////int main(){    LinkedList list,start;/*    printf("请输入单链表的数据:");    list = LinkedListCreatH();    for(start = list->next; start != NULL; start = start->next)        printf("%d ",start->data);    printf("/n");*/    printf("请输入单链表的数据:");    list = LinkedListCreatT();    for(start = list->next; start != NULL; start = start->next)        printf("%d ",start->data);    printf("/n");    int i;    ElemType x;    printf("请输入插入数据的位置:");    scanf("%d",&i);    printf("请输入插入数据的值:");    scanf("%d",&x);    LinkedListInsert(list,i,x);    for(start = list->next; start != NULL; start = start->next)        printf("%d ",start->data);    printf("/n");    printf("请输入要删除的元素的值:");    scanf("%d",&x);    LinkedListDelete(list,x);    for(start = list->next; start != NULL; start = start->next)        printf("%d ",start->data);    printf("/n");    return 0;}
0 0