- /单链表//
- #include <stdio.h>
- #include <malloc.h>
- #include <stdlib.h>
- #include <time.h>
- #define OK 1
- #define ERROR 0
- #define TRUE 1
- #define FALSE 0
- typedef int Status;
- typedef int ElemType; //ElemType类型根据实际情况而定,这里假定为int
- /* 线性表的单链表存储结构*/
- typedef struct Node
- {
- ElemType data; //存储数据元素
- struct Node* next; //存储指向后继的指针
- }Node, *LinkList;
- //单链表的读取操作,核心思想工作指针后移
- Status GetElem(LinkList L, int i, ElemType* e)
- {
- int j;
- LinkList p; //声明一个指向节点的P指针
- p = L->next; //p指向链表L中的第一个结点
- j = 1; //j为计数器
- while (p && j<i)
- {
- p = p->next; //核心思想是工作指针后移
- j++;
- }
- if (p || j>i)
- {
- return ERROR; //第i个元素不存在
- }
- *e = p->data;
- return OK;
- }
- //单链表的插入操作
- Status ListInsert(LinkList* L, int i, ElemType e)
- {
- int j = 1; //计速器
- LinkList p = *L; //工作指针,初始化指向头结点
- LinkList s = NULL;
- while(p && j<i) //让工作指针p指向i-1个结点
- {
- p = p->next;
- j++;
- }
- if (!p || j>i)
- {
- return ERROR;
- }
- s = (LinkList)malloc(sizeof(Node)); //生成新的结点
- s->data = e;
- s->next = p->next; //将p的后继结点赋值给s的后继
- p->next = s; //将s赋值给p的后继
- return OK;
- }
- //单链表的删除操作
- Status ListDelete(LinkList* L, int i, ElemType *e)
- {
- int j = 1; //计速器
- LinkList p = *L; //工作指针,初始化指向头结点
- LinkList q = NULL;
- while(p->next && j<i) //让工作指针p指向i-1个结点
- {
- p = p->next;
- j++;
- }
- if (!(p->next) || j>i)
- {
- return ERROR;
- }
- q = p->next;
- p->next = q->next;
- *e = q->data;
- free(q);
- return OK;
- }
- //单链表的整表创建,头插法,始终让新结点在第一个位置
- void CreateListHead(LinkList* L, int n)
- {
- LinkList p;
- int i;
- srand(time(0)); //初始化随机种子
- *L = (LinkList)malloc(sizeof(Node)); //头结点
- (*L)->next = NULL; //先建立一个带头结点的单链表
- for (i=0; i<n; i++)
- {
- p = (LinkList)malloc(sizeof(Node));
- p->data = rand()%100+1; //随机产生100以内的数字
- p->next =(*L)->next;
- (*L)->next = p;
- }
- }
- //单链表的整表创建尾插法,始终让新结点在最后位置
- void CreateListHead(LinkList* L, int n)
- {
- LinkList p, r;
- int i;
- srand(time(0)); //初始化随机种子
- *L = (LinkList)malloc(sizeof(Node)); //头结点
- (*L)->next = NULL; //先建立一个带头结点的单链表
- r = *L; //r为指向尾部的结点
- for (i=0; i<n; i++)
- {
- p = (LinkList)malloc(sizeof(Node));
- p->data = rand()%100+1; //随机产生100以内的数字
- p->next = NULL;
- r = p; //r要指向最后一个元素
- }
- r->next = p; //表示当前链表结束
- }
- //单链表的整表删除
- Status ClearList(LinkList* L)
- {
- LinkList p, q;
- p = (*L)->next; //p指向第一个结点
- while(p!=NULL)
- {
- q = p->next;
- free(p);
- p = q;
- }
- (*L)->next = NULL; //头结点指针域为NULL
- return OK;
- }
转载于:https://blog.51cto.com/lixiaomeng/746922