您的位置:首页 > 其它

wei 老师写的链表(参考)

2016-07-29 17:07 393 查看
#include <stdio.h>

#include <string.h>

#include <stdlib.h>

struct Node

{

    int data;

    struct Node *next;

};

typedef struct Node   LinkList;

#define LEN  sizeof(struct Node)

#define ERROR   1

#define OK      0

/* 初始化顺序线性表 */

LinkList *InitList(void) 



   LinkList *head;

    head=(LinkList *)malloc(LEN); /* 产生头结点,并使L指向此头结点 */

    if(head ==NULL)  /* 存储分配失败 */

            return ERROR;

   head->next=NULL; /* 指针域为空 */

    return head;

}

/* 初始条件:顺序线性表L已存在 */

/* 操作结果:链表输出,依次对L的每个数据元素输出 */

LinkList * print(LinkList *head)

{

    LinkList *p=head->next;

    if(p == NULL)

    printf("This is a empty.\n");

    while(p !=NULL)

{

        printf(" %d\n", p->data);

        p=p->next;

    }

    

    printf("\n");

    return head;

}

/*  随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) */

LinkList * CreateListTail(LinkList *head, int n) 

{

LinkList *pre,*after;

int i;

head = (LinkList *)malloc(LEN); /* L为整个线性表 */

pre=head; 

after=head;                               /* r为指向尾部的结点 */

for (i=0; i<n; i++) 

{

pre = (LinkList *)malloc(LEN); /*  生成新结点 */

scanf(" %d", &pre->data);

after->next=pre;                        /* 将表尾终端结点的指针指向新结点 */

after = pre;                            /* 将当前的新结点定义为表尾终端结点 */

}

pre->next = NULL;                       /* 表示当前链表结束 */

return head;

}

/*  随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) */

LinkList * CreateListHead(LinkList *head, int n) 

{

LinkList  *p, *q;

int i;

             

  head = (LinkList*)malloc(LEN);

  head->next = NULL;                      /*  先建立一个带头结点的单链表 */

  p=head->next;

  

for (i=0; i<n; i++) 

{

   p = (LinkList *)malloc(LEN); /*  生成新结点 */

scanf(" %d", &p->data);             

 p->next = head->next;    

 head->next = p;
/*  插入到表头 */

}

return head;

}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */

/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */

LinkList * ListDelete(LinkList *head,int i) 



int j=1;

LinkList *p,*q;

p = head;

while (p->next && j < i)
/* 遍历寻找第i个元素 */

{

        p = p->next;

        ++j;

}

if (!(p->next) || j > i) 

   return ERROR;           /* 第i个元素不存在 */

q = p->next;

p->next = q->next;
/* 将q的后继赋值给p的后继 */

free(q);                    /* 让系统回收此结点,释放内存 */

return head;

}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */

/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */

LinkList * ListInsert(LinkList *head,int i,int e)



int j=1;

LinkList *p,*s;

p = head;   

while (p && j < i)     /* 寻找第i个结点 */

{

p = p->next;

++j;



if (!p || j > i) 

return ERROR;   /* 第i个元素不存在 */

s = (LinkList *)malloc(LEN);  /*  生成新结点(C语言标准函数) */

s->data = e;  

s->next = p->next;      /* 将p的后继结点赋值给s的后继  */

p->next = s;          /* 将s赋值给p的后继 */

return head;

}

/* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */

LinkList * ClearList(LinkList *head)



LinkList *p,*q;

p=head->next;           /*  p指向第一个结点 */

while(p)                /*  没到表尾 */

{

q=p->next;

free(p);

p=q;

}

head->next=NULL;        /* 头结点指针域为空 */

return head;

}

int main()

{

 LinkList *head;

 

head=InitList();

print(head);

// head=CreateListHead(head,3);

head= CreateListTail(head, 3);

print(head);

head=ListDelete(head
9d27
,2);

print(head);

printf("insert>\n");

head=ListInsert(head,2,5);

print(head);

printf("clear>\n");

ClearList(head);

print(head);

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: