单链表的相关操作

来源:互联网 发布:数据库工程师招聘拉勾 编辑:程序博客网 时间:2024/05/20 15:57

直接上代码:

#include<iostream>using namespace std;#define LIST_INIT_SIZE 100#define LISTINCREMET 10#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define ElemType inttypedef struct LNode{ElemType data;struct LNode *next;}LNode,*LinkList;//以下链表均带头节点//链表的长度不算头节点int InitList(LinkList &L);int GetElem(LinkList L,int i,ElemType &e);int ListInsert(LinkList &L,int i,ElemType &e);int ListDelet(LinkList &L,int i,ElemType &e);int ListLength(LinkList &L);//返回L的长度int ListAddElem(LinkList &L,int n);//给一个空表添加n个元素int ListDisplay(LinkList &L);//输出现实L的元素void ListSort(LinkList &L);//从小到大排序void ListSort2(LinkList &L);//从小到大排序int ListMergeSort(LinkList &La,LinkList &Lb,LinkList &Lc);//有序表的合并void ListDeletElemFromMinkToMaxK(LinkList &La, int mink,int maxk);//La为有序表,删除表中所有值大于mink且小于maxk的元素(若表中存在)void ListTranspose(LinkList &La);//链表的转置int ListDeletRedundancy(LinkList &L);//删去值相同的多余结点,并返回冗余结点的个数 int main(int argc, char* argv[]){LinkList La,Lb,Lc;InitList(La); InitList(Lb); InitList(Lc);int n;while(true){cout<<"please La's length:"<<endl;cin>>n;ListAddElem(La,n);cout<<"please La's length:"<<endl;cin>>n;ListAddElem(La,n);/*ListInsert(La,2,e);cout<<"please Lb's length:"<<endl;cin>>n;ListAddElem(Lb,n);ListMergeSort(La,Lb,Lc);printf("List La:\n");ListDisplay(La);printf("List Lb:\n");ListDisplay(Lb);printf("List Lc:\n");ListDisplay(Lc);*//*cout<<"before sort:"<<endl;ListDisplay(La);ListSort2(La);cout<<"after sort:"<<endl;*//*int mink,maxk;cout<<"Please input mink and maxk: ";cin>>mink>>maxk;ListDeletElemFromMinkToMaxK(La,mink,maxk);*//*ListTranspose(La);*//*ListDeletRedundancy(La);*/ListDisplay(La);}return 0;}//初始化一个带头节点的链表int InitList(LinkList &L) {L = (LinkList)malloc(sizeof(LNode));if(!L)exit(OVERFLOW);L ->next = NULL;return TRUE;}//获得第i个节点元素,若存在,将值赋给e并返回TRUE,否则返回ERRORint GetElem(LinkList L,int i,ElemType &e){LNode *p = L->next;int j = 1;while(p&&j<i){p=p->next;++j;}if(!p||j>i) return ERROR;//没有找到e = p->data;return TRUE;}//在链表L第i个元素前插入eint ListInsert(LinkList &L,int i,ElemType &e){LNode *p = L;int j = 0;while(p&&j<i-1){p=p->next;++j;}if(!p||j>i-1) return ERROR;//i小于1或者大于表长加1LNode *s = (LinkList)malloc(sizeof(LNode));s->data = e;s->next = p->next; p->next = s;return OK;}//删除链表第i个元素,并由e返回其值int ListDelet(LinkList &L,int i,ElemType &e){LNode *p = L; int j = 0;while(p&&j<i-1){//寻找第i个节点,并令p指向其前驱p = p->next; ++j;}if(!p||j>i-1) return ERROR;LNode *q = p->next; p->next = q->next;e = q->data; free(q);return OK;}//返回链表的长度int ListLength(LinkList &L){LNode *p = L->next; int len = 0;while(p){p = p->next;len++;}return len;}//向L末尾添加n个元素int ListAddElem(LinkList &L,int n){LNode *p = L; ElemType e;while(p->next!=NULL)p = p->next;for(int i = 0; i<n; i++){LNode *s = (LinkList)malloc(sizeof(LNode));cin>>e;s->data = e;p->next = s;p = s;}p->next = NULL;//cout<<"表长:"<<ListLength(L)<<endl;return OK;}int ListDisplay(LinkList &L){LNode *p = L->next;ElemType e;while(p){e = p->data;cout<<e<<" ";p = p->next;}cout<<endl;return OK;}//排序方法二void ListSort2(LinkList &L){LNode *p,*q;//p指向基准点前一个节点,//q指向基准点LNode *r,*s;//r指向最小点前一个节点,//s指向最小点    LNode *temp;//扫描基准点以后的整个链表     if(L->next==NULL) printf("NO LINKLIST!!!");     else     { p = L; q = p->next;     while(q->next!=NULL) {  r = p; temp = q; while(temp->next!=NULL) { if(temp->next->data < r->next->data) r = temp; temp = temp->next; } if(r!=p) { s = r->next; r->next = s->next; p->next = s; s->next = q->next; } p = p->next; q = p->next; } }}//排序方法一void ListSort(LinkList &L){LNode *p,*q;//p指向基准点前一个节点,//q指向基准点LNode *m,*n;//m指向最小点前一个节点,//n指向最小点    LNode *temp;//扫描基准点以后的整个链表     if(L->next==NULL) printf("NO LINKLIST!!!");     else     {     p=L;q=L->next;     while(q->next!=NULL)     {     m=p->next;     n=q->next;     temp=m;     while(temp->next!=NULL)     {     if(temp->next->data<q->data && temp->next->data < n->data)     {m=temp;n=temp->next;     }temp=temp->next;     }     if(m!=p->next || (m==p->next && m->data>n->data))     {     p->next=n;     p=n;     m->next=q;     m=q;     q=q->next;     n=n->next;     p->next=q;     m->next=n;     }     else     {     p=p->next;     q=q->next;     }} }}//有序表的合并int ListMergeSort(LinkList &La,LinkList &Lb,LinkList &Lc){int i=1,j=1,k=0;int La_len = ListLength(La);int Lb_len = ListLength(Lb);ElemType ai,bj;while((i<=La_len)&&(j<=Lb_len)){GetElem(La,i,ai);GetElem(Lb,j,bj);if(ai<=bj){ListInsert(Lc,++k,ai);++i;}else{ListInsert(Lc,++k,bj);++j;}}while(i<=La_len){GetElem(La,i++,ai);ListInsert(Lc,++k,ai);}while(j<=Lb_len){GetElem(Lb,j++,bj);ListInsert(Lc,++k,bj);}return 0;}//La为有序表,删除表中所有值大于mink且小于maxk的元素(若表中存在)void ListDeletElemFromMinkToMaxK(LinkList &La, int mink,int maxk){LNode *p = La,*temp = NULL;LNode *pmink = NULL; LNode *pmaxk = NULL; while(p->next!=NULL && p->next->data<=mink)p = p->next;pmink = p;while(p->next!=NULL && p->next->data<maxk)p = p->next;pmaxk = p;p = pmink->next;pmink->next = pmaxk->next;pmaxk->next = NULL;while(p!=NULL){temp = p;p = p->next;free(temp);}}//链表反转void ListTranspose(LinkList &La){LNode *p = La->next; La->next = NULL;LNode *temp = NULL; LNode*q = NULL;while(p!=NULL){temp = p->next;//保存p的后继结点q = La->next;//保存La的后继结点La->next = p; p->next = q;p = temp;}}//去冗余结点,并返回冗余结点的个数int ListDeletRedundancy(LinkList &L){int count = 0;LNode *p = L->next,*q = NULL,*s = NULL,*t = NULL;//p指向当前节点,q遍历链表,s为q的前驱while(p!=NULL){q = p->next; s = p;while(q!=NULL){if(p->data==q->data){t = q;q = q->next;s->next = q;free(t);count++;}else{q = q->next;  s = s->next;}}p = p->next;}return count;}



原创粉丝点击