带头结点的单链表总结

来源:互联网 发布:手机淘宝设置在哪 编辑:程序博客网 时间:2024/05/22 20:26
  • 初始化
void InitList(LinkList &L){    L=(LinkList)malloc(sizeof(struct Lnode));    L->next=NULL;}
  • 头插法
1.
void CreateListH(LinkList &L,int a[],int n){    LinkList s;    int i;    for (i = 0; i < n; i++)                   //将数据插入链表头(L)的后面    {        s = (LinkList)malloc(sizeof(struct Lnode)); //  L是 链表的头        s->next = NULL;        s->data = a[i];        s->next = L->next;               //即:s指向 L的 指向,L指向s;        L->next = s;    }}
2.
LinkList CreateListH(LinkList L,int a[],int n){    LinkList s;    int i;    for (i = 0; i < n; i++)                   //将数据插入链表头(L)的后面    {        s = (LinkList)malloc(sizeof(struct Lnode)); //  L是 链表的头        s->next = NULL;        s->data = a[i];        s->next = L->next;               //即:s指向 L的 指向,L指向s;        L->next = s;    }    return L;}

分析:以上两个函数区别在于返回值不同,当无返回值时,建议用引用来随时更新链表状态;当有返回值时要返回后续需要的东西。

  • 尾插法
void CreateListE(LinkList &L,int a[],int n){    LinkList s;    LinkList r=L;//定义在尾部的指针    int i;    for(i=0;i<n;i++)    {        s=(LinkList)malloc(sizeof(struct Lnode));        s->next=NULL;        s->data=a[i];        r->next=s;        r=s;//更新尾部指针    }    r->next=NULL;//确定最后一个指针指向空}
  • 插入新的结点
void ListInsert(LinkList &L,int i,int e){    int j=1;    LinkList p=L;    LinkList s;    while(j<i && p!=NULL)    {        j++;        p=p->next;    }    if(p==NULL)    {        cout<<"false";    }    else    {        s=(LinkList)malloc(sizeof(LinkList));        s->data=e;        s->next=p->next;        p->next=s;    }}
  • 删除结点
void Listdelete(LinkList &L,int i){    int j;    LinkList p=L;    LinkList q;    for(j=0;j<i-1;j++)    //找到前一个结点    {        p=p->next;    }    if(p==NULL)    {        cout<<"this LinkList is empty"<<endl;    }    else    {        q=p->next;  //保留当前结点        if(q==NULL)        {            cout<<"this Linklist doesn't have "<<i<<" nodes"<<endl;        }    }    p->next=q->next;    delete(q);}
  • 冒泡排序
void Listsort(LinkList &L,int n){    LinkList p=L->next;    int temp;    while(n>1)    {        while(p->next!=NULL)        {            if(p->data>p->next->data)            {                temp=p->data;                p->data=p->next->data;                p->next->data=temp;            }            p=p->next;        }        n--;        p=L->next;//将指针重新返回到第一个节点;    }}

测试代码

#include<iostream>#include<cstdio>#include<cstdlib>using namespace std;typedef struct Lnode   //数据节点{    int data;    struct Lnode *next;}*LinkList;//typedef struct Lnode*  LinkList;void InitList(LinkList &L){    L=(LinkList)malloc(sizeof(struct Lnode));    L->next=NULL;}void CreateListH(LinkList &L,int a[],int n){    LinkList s;    int i;    for (i = 0; i < n; i++)                   //将数据插入链表头(L)的后面    {        s = (LinkList)malloc(sizeof(struct Lnode)); //  L是 链表的头        s->next = NULL;        s->data = a[i];        s->next = L->next;               //即:s指向 L的 指向,L指向s;        L->next = s;    }}void CreateListE(LinkList &L,int a[],int n){    LinkList s;    LinkList r=L;    int i;    for(i=0;i<n;i++)    {        s=(LinkList)malloc(sizeof(struct Lnode));        s->next=NULL;        s->data=a[i];        r->next=s;        r=s;    }    r->next=NULL;}void cout1(LinkList L){    LinkList p=L->next;    while(p!=NULL)    {        printf("%d ",p->data);        p=p->next;    }}void ListInsert(LinkList &L,int i,int e){    int j=1;    LinkList p=L;    LinkList s;    while(j<i && p!=NULL)    {        j++;        p=p->next;    }    if(p==NULL)    {        cout<<"false";    }    else    {        s=(LinkList)malloc(sizeof(LinkList));        s->data=e;        s->next=p->next;        p->next=s;    }}void Listdelete(LinkList &L,int i){    int j;    LinkList p=L;    LinkList q;    for(j=0;j<i-1;j++)    {        p=p->next;    }    if(p==NULL)    {        cout<<"this LinkList is empty"<<endl;    }    else    {        q=p->next;        if(q==NULL)        {            cout<<"this Linklist doesn't have "<<i<<" nodes"<<endl;        }    }    p->next=q->next;    delete(q);}void Listsort(LinkList &L,int n){    LinkList p=L->next;    int temp;    while(n>1)    {        while(p->next!=NULL)        {            if(p->data>p->next->data)            {                temp=p->data;                p->data=p->next->data;                p->next->data=temp;            }            p=p->next;        }        n--;        p=L->next;//将指针重新返回到第一个节点;    }}int main(void){    int a[1000];    int i;    int e;    LinkList L;    LinkList L1;    int number;    cout<<"please input a number:";    cin>>number;    for(i=0;i<number;i++)    {        scanf("%d",&a[i]);    }    InitList(L);    InitList(L1);    CreateListH(L,a,number);    cout1(L);    Listsort(L,number);    cout<<endl;    cout1(L);    CreateListE(L1,a,number);    cout<<endl;    cout1(L1);    cout<<endl<<"please input a number:";    cin>>e;    ListInsert(L,3,e);    cout1(L);    cout<<endl;    Listdelete(L,4);    cout1(L);    return 0;}
原创粉丝点击