数据结构---C语言单链表基本操作

来源:互联网 发布:微博域名是什么 编辑:程序博客网 时间:2024/06/01 18:26
#include"stdio.h"       //单链表基本操作---头节点第0个,第一个节点第1个#include"stdlib.h"#define Elemtype inttypedef struct Lnode{    struct Lnode *next;    Elemtype value;}Lnode,*Linklist;Lnode *tail = NULL;/*************空链表的初始化************************/int Initlist(Linklist *L){    *L=(Linklist)malloc(sizeof(Lnode));    if(!*L)   //L为二级指针        return 0;    else    {        (*L)->next=NULL;        (*L)->value=0;        tail = *L;        return 1;    }}/***********获得尾节点******************************///---------------------------------------------------Linklist get_tail(Linklist L){    Linklist p = L;    if(L==NULL)    {        printf("error!\n");    }    while(p->next)    {        p=p->next;    }    return p;  //p指向尾结点}/***********头插法建立单链表************************/    //head不动int Buildlist1(Linklist L,Elemtype m)  //L 为一直指向空的头节点头指针,此头插法为已经初始化的情况下{    Linklist b;    b=(Linklist)malloc(sizeof(Lnode));    if(b==NULL)        return 0;    b->next=L->next;    L->next=b;    b->value=m;}/**************尾插法建立单链表***************************/    //尾巴动int Buildlist2(Linklist L,Elemtype m){    Linklist b;    tail = get_tail(L);    b=(Linklist)malloc(sizeof(Lnode));    if(b == NULL)        return 0;    b->next=NULL;    tail->next=b;    b->value=m;    tail=b;}/*****************遍历***********************/int printlist(Linklist L){    Linklist p=L;    if(p->next==NULL)    {        printf("empty linklist!\n");        return 0;    }    while(p->next)//跳过了第一个空节点的值    {        p=p->next;        printf("%d\t",p->value);    }    printf("\n");}/****************求表长***********************/int lengthlist(Linklist L)//不算头节点{    int i=0;    Linklist p=L;    while(p->next)    {        i++;        p=p->next;    }    return i;}/****************向线性表中插入一个元素**********************/int add_elem(Linklist L,Elemtype m,int n)    //将p定位到要插入的位置之前,删除同理,n为要插入到的位置{    Linklist p=L,q;    int i=0;    while(p&&(i+1<n))    {        i++;        p=p->next;    }    if((i+1>n)||!p)    {        printf("error!\n");       //和删除有区别,因为一个0-----n的链表插入下标的范围为1-----n+1        return 0;    }    q=(Linklist)malloc(sizeof(Lnode));    q->next=p->next;    p->next=q;    q->value=m;    return 1;}/****************从表中删除一个元素*************************/int delate_elem(Linklist L,Elemtype *m,int n)   //n是位置,头节点不能删除,所以从1开始数{    Linklist p=L,q;    int i=0;    while(p&&(i+1<n))  //找到要删除元素的前驱    {        i++;        p=p->next;    }    if((i+1>n)||!(p->next))    {        printf("error!\n");        return 0;    }    *m=p->next->value;    q=p->next->next;    //这里注意p->next->next要先保存,不然把 p->next  free掉后就找不到乐    free(p->next);    p->next=q;    return 1;}/******************在表中查找第n个数并返回值和指针*******************/Linklist get_elem(Linklist L,Elemtype *m,int n){    Linklist p=L->next;    int i=1;    while(p&&i<n)    {        i++;        p=p->next;    }    if(i>n||!p)    {        printf("error!\n");    }    *m=p->value;    return p;}/********************单链表的销毁**********************/int destroy_list(Linklist *L)   //Free函数的参数一定要是malloc返回的那个指针,用*L为了销毁头节点{    Linklist p=*L;    while(p)    {        p=(*L)->next;        free(*L);        (*L)=p;    }    return 1;}/*******************单链表的置空**********************/    //只剩头节点int empty_list(Linklist L){    Linklist p,q=L->next;    while(q)    {        p=q->next;        free(q);        q=p;    }    L->next=NULL;     //忘记这里乐    return 1;}/*************************判断单链表是否为空*****************/int if_empty(Linklist L){    if(L->next==NULL)        return 1;    return 0;}/******************单链表的连接(2接到1上)********************/void linklinklist(Linklist L1,Linklist L2){    Linklist L=L1;    while(L->next)    {        L=L->next;    }    L->next=L2->next;  //注意这里要把L2的头节点跳过}/***************两个结点的交换**********************************/void swap_value(Linklist L,int pos1,int pos2)//注意,链表中涉及到交换的,只交换值,不交换指针,反正都是一样大的空间!{    int i=0,j=0,value1=0,value2=0;    Linklist L1,L2;    L2= L1=NULL;    Linklist head=L->next;    L1=get_elem(L,&value1,pos1);    L2=get_elem(L,&value2,pos2);    L1->value = value2;    L2->value = value1;}/************比较大小并交换值*********************************/void exchange(int *p1,int *p2)   //比较大小,如果a>b则交换{    int a;    a=*p1;    *p1=*p2;    *p2=a;}/*******************单链表的冒泡排序************************/int orderlist(Linklist L)  //有头节点{    Linklist phead;    int len;    int i,j;    len=lengthlist(L);    if(L->next==NULL)    {        printf("单链表为空,无法排序!\n");        return 0;    }    for(i=0;i<len-1;i++)    {        phead=L->next;        for(j=0;j<len-i-1;j++)        {            if(phead->value > phead->next->value)                exchange(&(phead->value),&(phead->next->value));            phead=phead->next;        }    }}/******************单链表的合并(1)******************************/int togetherlist(Linklist L1,Linklist L2,Linklist *L3)  //L3有头节点,针对有序链表{     int len1,len2,len3=0,i=0,j=0,k=0;     Linklist b,tail;     len1=lengthlist(L1);     len2=lengthlist(L2);     orderlist(L1);     orderlist(L2);     L1=L1->next;     L2=L2->next;//因为之前有头节点     *L3=(Linklist)malloc(sizeof(Lnode));     (*L3)->value=0;     if(*L3==NULL)        return 0;     tail=*L3;  //尾插法建立L3     /*while((i<len1-1)&&(j<len2-1))    //不删除重复元素     {         b=(Linklist)malloc(sizeof(Lnode));         b->next=NULL;         tail->next=b;         tail=b;         if((L1->value)<=(L2->value))         {             i++;             b->value=L1->value;             L1=L1->next;         }         else         {             j++;             b->value=L2->value;             L2=L2->next;         }         k++;     }*/     while((i<len1)&&(j<len2))    //删除重复元素     {         b=(Linklist)malloc(sizeof(Lnode));         b->next=NULL;         tail->next=b;         tail=b;         if((L1->value)<(L2->value))         {             i++;             b->value=L1->value;             L1=L1->next;         }         else if((L1->value)==(L2->value))         {             i++;             j++;             b->value=L1->value;             L1=L1->next;             L2=L2->next;         }         else         {             j++;             b->value=L2->value;             L2=L2->next;         }         k++;     }     while(i<len1)     {         b=(Linklist)malloc(sizeof(Lnode));         b->next=NULL;         tail->next=b;         tail=b;         i++;         b->value=L1->value;         L1=L1->next;     }     while(j<len2)     {         b=(Linklist)malloc(sizeof(Lnode));         b->next=NULL;         tail->next=b;         tail=b;         j++;         b->value=L2->value;         L2=L2->next;     }     (*L3)->value=k;}/****************主函数***************************/int main(void){    int a=0;    int i;    Elemtype m=100;    Linklist L1,L2,L3;    srand((unsigned)time(NULL));    if(!Initlist(&L1))    {        printf("ERROR!\n");    }    if(!Initlist(&L2))    {        printf("ERROR!\n");    }    for(i=0;i<3;i++)    {        Buildlist2(L1,rand()%100);    }    for(i=0;i<5;i++)    {        Buildlist2(L2,rand()%100);    }    printlist(L1);    printlist(L2);    togetherlist(L1,L2,&L3);    printlist(L3);}

阅读全文
0 0
原创粉丝点击