/*
* 单链表的基本操作实现
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<iostream>
using namespace std;
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
} Node;
typedef struct Node *LinkList;

/*
* @function : 单链表的创建 (头插法)
* @return : void
*/
void CreateListHead(LinkList *L, int n){
LinkList p;
int i;
srand(time(0));
*L = (LinkList)malloc(sizeof(Node)); //*L 二重指针
(*L)->next = NULL;
for(i = 0; i < n; i++){
p = (LinkList)malloc(sizeof(Node));
p->data = rand()%100 + 1;
p->next = (*L)->next;
(*L)->next = p;
}
}

/*
* @function : 单链表的创建 (尾插法)
* @return : void
*/
void CreateListTail(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;
r->next = p;
r = p;
}
r->next = NULL;
}

/*
* @function : 获取单链表的元素
* @return : bool
* @param :
*/
bool GetElem(LinkList L, int i, ElemType *e){
int j;
LinkList p; //声明节点p
p = L->next; //让p指向链表L的第一个节点
j = 1; //计数器
while(p && j < i){ //p不空, 计数器j还没有等于时,循环持续
p = p->next; //让p指向下一个节点
++j; //计数器增加
}
if(!p || j > i){ //节点为空或者 计数器j大于i
return false; //该数据不存在
}
*e = p->data; //将要取得数据赋值给e
return true; //返回成功
}

/*
* @function : 向链表插入数据e
* @return : bool
*/
bool ListInsert(LinkList *L, int i, ElemType e){
int j;
LinkList p, s; //声明两个节点,p是迭代节点用来找到所需要的插入的节点位置,s 用来指向生成新的节点用来存放需要插入的数据
p = *L;
j = 1;
while(p && j < i){ //寻找第i个节点
p = p->next;
++j;
}
if(!p || j > i){ //找不到返回false
return false;
}
s = (LinkList)malloc(sizeof(Node)); //生成新的节点
s->data = e; //为新的节点赋值为e
s->next = p->next; // 将p的后继节点的地址赋给s的next指针
p->next = s; //将p的后继指针指向s节点
return true;
}

/*
* @function : 删除某个节点的数据
* @return : bool
*/
bool ListDelete(LinkList *L, int i, ElemType *e){
int j;
LinkList p, q;
p = *L;
j = 1;
while (p->next && j < i){ //查找要删除节点
p = p->next;
++j;
}
if(!(p->next) || j > i)
return false;
q = p->next; //将p的后继节点fa赋值给q
p->next = q->next; //p->next的后继节点赋值为p->next指针
*e = q->data; //将q->data 赋值给e
free(q); //释放需要删除的节点空间
return true;
}

int GetLength(LinkList L){
int j = 0;
LinkList p;
p = L->next;
while(p){
++j;
p = p->next;
}
return j;
}

/*
* @function : 输出链表中的数据
*/
void Display(LinkList L){
LinkList p;
p = L->next;
while(p){
printf("%d\t",p->data);
p = p->next;
}
printf("\n");
}

/*
* @function : 清空链表
* @return : bool
*/
bool ClearList(LinkList *L){
LinkList p, q;
p = (*L)->next;
while(p){
q = p->next;
free(p);
p = q;
}
(*L)->next = NULL;
return true;

}
int main(){
LinkList L;
int a, b;
// CreateListHead(&L, 5);
CreateListTail(&L, 5);
Display(L);
printf("LinkList length is : %d\n",GetLength(L));
GetElem(L, 3, &a);
printf("get element is :%d\n",a);
ListInsert(&L, 3, 100);
printf("insert element:");
Display(L);
ListDelete(&L, 3, &b);
printf("delete element:");
Display(L);
if(ClearList(&L)){
printf("Clear Link OK!\n");
}else{
printf("Clear Link ON!\n");
}
return 0;
}

单链表基本操作C语言实现_数据结构

ps:代码全都加了注释,方便阅读