链表 C语言实现

来源:互联网 发布:算边坡稳定性的软件 编辑:程序博客网 时间:2024/04/26 14:16

使用GCC 5.4 测试

#include <stdio.h>#include <stdlib.h>typedef int ElemType;/** 定义链表的一个节点的结构*/struct node {    ElemType data;   /*数据域*/    struct node *next;  /*指针域*/}  ;typedef   struct  node *LinkList;//指向结构的指针typedef   struct  node LNode;//创建链表LinkList CreateLinkList(int n) {    LinkList p,r,list=NULL;    ElemType e;    int i;    for(i=1; i<=n; i++) {        scanf("%d",&e);        p=(LinkList)malloc(sizeof(LNode));        p->data=e;        p->next=NULL;        if(!list) {            list=p;        } else {            r->next=p;        }        r=p;    }    return list;}//插入链表void insertList(LinkList *list,LinkList q,ElemType e) {    LinkList p;//临时链表指针P    p=( LinkList)malloc(sizeof(LNode));// 分配空间。    p->data=e;// 进行数据赋值//  printf ("%d\n",*list) ;    if(!*list) {//如果 list 为空,         *list=p;        p->next=NULL;    } else {//q的指针指向 P,        p->next=q->next;        q->next=p;    }}//删除节点 void delLink(LinkList *list ,LinkList q) {    LinkList r;    if(&q==list) {        *list=q->next;        free(q);    } else {        for(r=*list; r->next!=q; r=r->next);        if(r->next!=NULL) {            r->next=q->next;            free(q);        }    }}void  destroyLinkList(LinkList *list) {    LinkList p,q;    p=*list;    while(p) {        q=p->next;        free(p);        p=q;    }    *list=NULL;}int main() {    int e,i;    LinkList l,q;    q=l=CreateLinkList(1);   /*创建一个链表结点,q和l指向该结点*/    //创建的第一个节点 , next 节点指向空//  printf ("%d\n",l->data);    scanf("%d",&e);    while(e) {           /*循环地输入数据,同时插入新生成的结点*/        insertList(&l,q,e) ;        q=q->next;        scanf("%d",&e);    }    q=l;    printf("The content of the linklist\n");    while(q) {        /*输出链表中的内容*/        printf("%d ",q->data);        q=q->next;    }    q=l;    printf("\n删除第五个元素\n");    for(i=0; i<4; i++) { /*将指针q指向链表第5个元素*/        if (q == NULL) {            printf("The length of the linklist is smaller than 5 !");            return;        }        q=q->next;    }    delLink(&l,q);     /*删除q所指的结点*/    q=l;    while(q) {          /*打印出删除后的结果*/        printf("%d ",q->data);        q=q->next;    }    destroyLinkList(&l);  /*释放掉该链表*/    return 0;}
0 0
原创粉丝点击