C语言 头指针单链表

来源:互联网 发布:苹果5s支持4g网络吗 编辑:程序博客网 时间:2024/05/21 11:02

初学者,有错误请指正,谢谢!

C语言头指针单链表实现:

#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef int ElemType;typedef struct LNode{    ElemType data;    struct LNode *next;}LNode,*LinkList;//创建一个空表LinkList CreateList(LinkList L){    LinkList p=NULL;    if(L==NULL){        p=(LinkList)malloc(sizeof(LNode));        if(p==NULL){            free(p);            exit(0);        }        L=p;        L->next=NULL;    }    else        exit(0);    return L;}//创建一个长度为size的链表(链尾插入)LinkList CreateList_T(LinkList L,int size){    LinkList p,q;    int i;    L=CreateList(L);    p=L;    for(i=0;i<size;i++){        q=(LinkList)malloc(sizeof(LNode));        if(!q){            free(q);            exit(0);        }        else{            //printf("data:");            //scanf("%d",&q->data);            q->data=rand()%100;            q->next=NULL;            p->next=q;            p=q;            if(i==0)                L->next=p;            //printf("%d\n",p->data);        }    }    return L;}//创建一个长度为size的链表(链头插入)LinkList CreateList_H(LinkList L,int size){    LinkList p;    int i;    L=CreateList(L);    for(i=size;i>0;i--){        p=(LinkList)malloc(sizeof(LNode));        if(!p)            exit(0);        else{            //printf("data:");            //scanf("%d",&p->data);            p->data=rand()%100;            p->next=L->next;            L->next=p;        }    }    return L;}//链表长度int ListLength(LinkList L){    LinkList p=L->next;    int i=0;    while(p){        p=p->next;        i++;    }    return i;}//插入元素void InsertNode(LinkList L,int pos,ElemType e){//元素插在第pos个位置    LNode *p=L,*q;    int i=0;    while(p->next!=NULL&&i<pos-1){//寻找第pos-1个结点        p=p->next;        i++;    }    if(!p||i>pos-1)//pos小于1或大于表长+1        exit(0);    q=(LinkList)malloc(sizeof(LNode));    if(!q)        exit(0);    else{        q->data=e;        q->next=p->next;        p->next=q;    }}//删除元素ElemType DeleteNode(LinkList L,int pos){    LNode *p=L,*q;    ElemType e;    int i=0;    while((p->next!=NULL)&&(i<pos-1)){//寻找第pos-1个结点        p=p->next;        i++;    }    if(!(p->next)||i>pos-1)        exit(0);    else{        q=p->next;        p->next=q->next;        e=q->data;        free(q);    }    return e;}//检查头指针及其next域是否为空void CheckLinkList(LinkList L){    if(!L)        exit(0);    if(!(L->next))        exit(0);}//遍历链表void TraverseList(LinkList L){    LinkList p;    CheckLinkList(L);    for(p=L->next;p!=NULL;p=p->next){        printf("Element is %d\n",p->data);    }}//查询元素在链表第一次出现的位置int SearchNode(LinkList L,ElemType e){    int i=0;    LNode *p=L->next;    while(p){        i++;        if(p->data==e)            return i;        p=p->next;    }    return 0;}//倒置链表LinkList ReverseList(LinkList L){    LNode *p,*q,*s;    p=L;    q=p->next;    while(q->next){        s=q->next;        q->next=p;        p=q;        q=s;    }    q->next=p;    L->next->next=NULL;    L->next=q;    return L;}//删除链表void DeleteList(LinkList L){    LNode *p,*q;    CheckLinkList(L);    p=L->next;    while(p){        q=p;        p=p->next;        free(q);    }    free(p);}int main(){    int n,length,pos;    LinkList L=NULL;    scanf("%d",&n);//链表长度    //L=CreateList_T(L,n);    L=CreateList_H(L,n);    TraverseList(L);    length=ListLength(L);    printf("The length of the linklist is %d\n\n",length);    InsertNode(L,1,0);    TraverseList(L);    pos=SearchNode(L,41);    printf("The position of 41 is %d\n",pos);    length=ListLength(L);    printf("The length of the linklist is %d\n\n",length);    DeleteNode(L,1);    TraverseList(L);    length=ListLength(L);    printf("The length of the linklist is %d\n\n",length);    L=ReverseList(L);    TraverseList(L);    DeleteList(L);    return 0;}


0 0
原创粉丝点击