类C语言 数据结构单链表基本算法

191 阅读3分钟

# 数据结构 ------- C语言实现单链表各种基本运算的算法

#include<stdio.h>
#include<malloc.h>
typedef char ElemType;
typedef struct LNode{
  ElemType data;
  struct LNode *next; // 指向后继节点
}LinkNode; //声明单链表节点类型

# // 头插法建立单链表
void CreateListF(LinkNode *&L, ElemType a[], int n)
{
  LinkNode * s;
  L = (LinkNode *)malloc(sizeof(LinkNode));
  L->next=NULL;
  for (int i = 0; i < n; i++)
  {
    s = (LinkNode *)malloc(sizeof(LinkNode)); // 创建新节点s
    s->data = a[i];
    s->next = L->next; //将节点s插在开始接电之前,头节点之后
    L->next = s; 
  }
}

// 尾插法建立单链表
void CreateListR(LinkNode *&L, ElemType a[], int n)
{
  LinkNode *s, *r;
  L = (LinkNode *)malloc(sizeof(LinkNode)); // 创建头节点
  L->next = NULL;
  r = L;
  for (int i = 0; i < n; i++) {
     s = (LinkNode *)malloc(sizeof(LinkNode)); // 创建新的节点
     s->data = a[i];
     r->next = s;
     r = s;
  }
  r -> next = NULL; //尾节点next置空
}

// 初始化线性表
void InitList(LinkNode *&L)
{
  L = (LinkNode *)malloc(sizeof(LinkNode)); //创建头节点
  L->next = NULL;  //将链表置空
}

// 销毁线性表
void DestroyList(LinkNode *&L)
{
  LinkNode *pre = L, *p = pre->next;
  while(p != NULL)
  {
    free(pre); 
    pre = p;
    p = pre->next;
  }
  free(pre); // 此时p为NULL ,pre指向尾节点,释放它
}

// 判断线性表是否为空
bool ListEmpty(LinkNode *L)
{
  return (L->next==NULL);
}


// 求线性表的长度
int ListLength(LinkNode  *L)
{
  int i = 0;
  LinkNode *p = L;  // p指向头节点
  while(p->next != NULL)
  {
    i++;
    p = p->next;
  }
  return i;
}

// 输出线性表
void DispList(LinkNode *L)
{
  LinkNode *p = L->next; // p指向元素首节点
  while(p != NULL)  //p不为NULL 输出p节点的data
  {
    printf("%c", p->data);
    p = p->next; // p移向下一个节点
  }
  printf("\n");
}


//输出线性表
void DispList(LinkNode *L){
	LinkNode *p = L->next;    //p指向首节点
	while(p != NULL){    //p不为NULL,输出p节点的data
		printf("%c", p->data);
		p = p->next;    //p移向下一个节点
	}
	printf("\n");
}
 
//求线性表中第i个元素值
bool GetElem(LinkNode *L, int i, ElemType &e){
	int j = 0;
	LinkNode *p = L;							//p指向头节点,j置为0(即头节点序号为0)
	if(i <= 0) return false;					//i错误返回假
	while(j < i && p != NULL){					//找出第i个节点p
		j++;											
		p = p->next;
	}
	if(p == NULL)
		return false;							//不存在第i个数据节点,返回false
	else{										//存在第i个数据节点,返回true
		e = p->data;
		return true;
	}
}
 
//查找第一个值为e的元素符号
int LocateElem(LinkNode *L, ElemType e){
	int i = 1;
	LinkNode *p = L->next;						//p指向首节点,i置为1(即头节点序号为1)
	while(p != NULL && p->data != e){//查找data值为e的节点,其序号为i
		p = p->next;
		i++;
	}
	if(p == NULL)								//找不到返回0
		return 0;
	else										//找到返回其序号i
		return i;
}![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/441ea333ee6947bf843211a307845f36~tplv-k3u1fbpfcp-zoom-1.image)
 
//插入第i个元素
bool ListInsert(LinkNode *&L, int i, ElemType e){
	int j = 0;
	LinkNode *p = L, *s;						//p指向头节点,j置为0(即头节点序号为0)
	if(i <= 0)									//i错误返回假
		return false;
	while(j < i - 1 && p != NULL){				//查找第i-1个节点p
		j++;
		p = p->next;
	}
	if(p == NULL)
		return false;
	else{										//将节点s插入
		s = (LinkNode *)malloc(sizeof(LinkNode));
		s->data = e;
		s->next = p->next;
		p->next = s;
		return true;
	}
}
 
//删除第i个元素
bool ListDelete(LinkNode *&L, int i, ElemType &e){
	int j = 0;
	LinkNode *p = L, *q;						//p指向头节点,j置为0(即头节点序号为0)
	if(i <= 0)
		return false;
	while(j < i - 1 && p != NULL){				//查找第i-1个节点p
		j++;
		p = p->next;
	}
	if(p == NULL)
		return false;
	else{										//将第i个节点删除
		q = p->next;
		if(p == NULL)
			return false;
		e = q->data;
		p->next = q->next;
		free(q);
		return true;
	}
}

`#include "LinkList.cpp"

 #include "LinkList.cpp"
 int main()
 {
   LinkNode *h;
   ElemType e;
   printf("单链表的基本运算如下:\n");
	printf("  (1)初始化单链表 h\n");
	InitList(h);
	printf("  (2)依次采用尾插法插入a,b,c,d,e,元素\n");
	ListInsert(h,1,'a');
	ListInsert(h,2,'b');
	ListInsert(h,3,'c');
	ListInsert(h,4,'d');
	ListInsert(h,5,'e');
	printf("  (3)输出单链表h:");	DispList(h);
	printf("  (4)单链表h长度:%d\n", ListLength(h));
	printf("  (5)单链表h为%s\n", (ListEmpty(h)?"空":"非空"));
	GetElem(h, 3, e);
	printf("  (6)单链表h的第3个元素:%s\n", e);
	printf("  (7)元素a的位置:%d\n", LocateElem(h,'a'));
	printf("  (8)在第4个元素位置上插入f元素\n");
	ListInsert(h,4,'f');
	printf("  (9)输出单链表h:");	DispList(h);
	printf("  (10)删除h的第3个元素\n");
	ListDelete(h,3,e);
	printf("  (11)输出单链表h:");	DispList(h);
	printf("  (12)释放单链表h\n");
	DestroyList(h);
	return 1;
 }