链表的排序与删除

来源:互联网 发布:蜗居海藻知乎 编辑:程序博客网 时间:2024/05/29 16:30
#include<iostream>#include<cstring>#include<malloc.h>using namespace std;typedef int ElemType;typedef struct LNode{ElemType data;struct LNode *next;}LinkList;void CreateListF(LinkList *&L, ElemType a[], int n);void CreateListR(LinkList *&L, ElemType a[], int n);void DispList(LinkList *L);void DestoryList(LinkList *&L);void delmaxnode(LinkList *&L);//删除对达的节点void sort(LinkList *&L);//排序void CreateListF(LinkList *&L, ElemType a[], int n){LinkList *s;L = (LinkList*)malloc(sizeof(LinkList));L->next = NULL;for (int i = 0; i < n; i++){s = (LinkList*)malloc(sizeof(LinkList));s->data = a[i];s->next = L->next;L->next = s;}}void CreateListR(LinkList *&L, ElemType a[], int n){LinkList *s;LinkList *r;L = (LinkList*)malloc(sizeof(LinkList));L->next  = NULL;r = L;for (int i = 0; i < n; i++){s = (LinkList*)malloc(sizeof(LinkList));s->data = a[i];r->next = s;r = s;}r->next = NULL;}void DispList(LinkList *L){LinkList *s;s = L->next ;while (s){cout << s->data << endl;s = s->next;}}void DestoryList(LinkList *&L){LinkList *s;LinkList *p;s = L;p = L->next;while (!p){free(s);s = p;p = s->next;}free(s);}void delmaxnode(LinkList *&L){LinkList *p = L->next; //p用来遍历链表LinkList *pre = L;    //表示指向p的前一个节点LinkList *max = p;    //表示最大节点LinkList *premax = pre;//表示最大节点的前一个节点while (p!=NULL){if (max->data < p->data){max = p;premax = pre;}p = p->next;pre = pre->next;}premax->next = max->next;free(max);}void sort(LinkList *&L){LinkList *p, *pre, *q;p = L->next->next;        //p指向L的第2个数据节点L->next->next = NULL;     //构造只含一个数据节点的有序表while (p != NULL){q = p->next;          //q保存*p节点后继节点的指针pre = L;              //从有序表开头进行比较,pre指向插入*p的前驱节点while (pre->next != NULL && pre->next->data<p->data)pre = pre->next;  //在有序表中找插入*p的前驱节点*prep->next = pre->next;  //将*pre之后插入*ppre->next = p;p = q;                //扫描原单链表余下的节点}}int main(){LinkList *L;int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };CreateListF(L, a, 9);delmaxnode(L);DispList(L);CreateListR(L, a, 9);delmaxnode(L);DispList(L);for (;;){}return 0;}

0 0
原创粉丝点击