数据结构——单链表整表操作(C语言)
1.单链表的创建
顺序存储结构的创建其实就是一个数组初始化的过程,即声明一个类型和大小的数组并赋值的过程,但是单链表不一样,它是一种动态结构。它的空间大小和位置不需要预先分配,可以根据要求随时生成。我们可以给出以下的代码去实现:
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef struct Node{
ElemType data;
struct Node *Next;
}Node;
typedef struct Node *LinkList; //单链表的存储结构
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));
r=*L;
for(i=0;i<n;i++){
p=(Node*)malloc(sizeof(Node)); //生成新的节点
p->data = rand()%100+1; //随机生成100以内的数字
r->next = p; //将表尾终端节点的指针指向新的节点
r = p; //将当前新节点定义为表尾终端节点
}
r->next=NULL; //新的节点的指针域为空
}
2.单链表的整表删除
当我们不打算使用这个单链表时,要将其删除并释放内存,留出空间给其他程序使用。
Status ClearList(LinkList *L){
LinkList p,q;
p=(*L)->next; //p指向第一个节点
while(p){
q=p->next;
free(q);
p=q;
}
(*L)->next=NULL; //头节点指针域为空
return OK;
}