数据结构C语言版-严蔚敏 笔记及源码(2)线性表的链式表示和实现

线性表的链式表示和实现

关注公众号:python小咖 回复 数据结构C语言 可以获得源码

链表创建有两种方式,一种为头插法创建,一种为尾插法创建

  1. 头插法创建:从一个空表开始,重复读入数据,生成新结点,
    将读入数据存放入新结点的数据域中

  2. 头插法建立链表虽然算法简单,但生成的链表中结点的次序和输入的顺序相反,
    若希望二者的次序一致,可采用尾插法建表。该方法是将新结点插入到当前链表的表尾,
    使其成为当前链表的尾结点。

头插法创建链表
//头插法建表
LNode *create_LinkList_L(){
	int data;
	LNode *head, *p; 
	head = (LNode *)malloc(sizeof(LNode));
	head -> next = NULL;
	while(TRUE){
		scanf("%d",&data);
		if (data == 32767) break;  //当输入值为32767时,退出 
		p = (LNode *)malloc(sizeof(LNode));  //创建新结点 
		p->data = data;  //给新结点数据域赋值 
		p->next = head->next;
		head->next = p;
	} 
	return (head);
 } 
尾插法创建链表
//尾插法建表
LNode *create_LinkList_R(){
	int data;
	LNode *head, *p ,*r;
	head = (LNode *)malloc(sizeof(LNode));
	head -> next = NULL;
	r = head;
	while(TRUE){
		scanf("%d",&data);
		if (data == 32767) break;
		p = (LNode *)malloc(sizeof(LNode));
		p -> data = data;
		
		p -> next = r -> next;
		r -> next = p;
		r = p;
	}
	return (head);
}

其余操作:
ListInsert(LinkList &L,int index,ElemType e) : 在带头结点的单链线性表L的第i个元素之前插入元素e
ListTravel(LinkList L) :遍历单链表
ListDelete(LinkList &L,int index,ElemType &e) :删除线性表L的第i个元素并用e返回

其他功能晚点放上来

#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1 
#define OVERFLOW -2
typedef int ElemType; 
typedef int Status;  

typedef struct LNode{ 
	ElemType data;  //数据域 
	struct LNode *next;
}LNode, *LinkList;


/* 
链表创建有两种方式,一种为头插法创建,一种为尾插法创建
1. 头插法创建:从一个空表开始,重复读入数据,生成新结点,
  将读入数据存放入新结点的数据域中 
  
2. 头插法建立链表虽然算法简单,但生成的链表中结点的次序和输入的顺序相反,
  若希望二者的次序一致,可采用尾插法建表。该方法是将新结点插入到当前链表的表尾,
  使其成为当前链表的尾结点。 
*/

//头插法建表
LNode *create_LinkList_L(){
	int data;
	LNode *head, *p; 
	head = (LNode *)malloc(sizeof(LNode));
	head -> next = NULL;
	printf("请输入元素,按空格确认,输入32767则退出输入:\n");
	while(TRUE){
		scanf("%d",&data);
		if (data == 32767) break;  //当输入值为32767时,退出 
		p = (LNode *)malloc(sizeof(LNode));  //创建新结点 
		p->data = data;  //给新结点数据域赋值 
		p->next = head->next;
		head->next = p;
	} 
	return (head);
 } 
 
//尾插法建表
LNode *create_LinkList_R(){
	int data;
	LNode *head, *p ,*r;
	head = (LNode *)malloc(sizeof(LNode));
	head -> next = NULL;
	r = head;
	printf("请输入元素,按空格确认,输入32767则退出输入:\n");
	while(TRUE){
		scanf("%d",&data);
		if (data == 32767) break;
		p = (LNode *)malloc(sizeof(LNode));
		p -> data = data;
		
		p -> next = r -> next;
		r -> next = p;
		r = p;
	}
	return (head);
}



Status GetElem(LinkList &L,int i, ElemType &e) {
  // L为带头结点的单链表的头指针。
  // 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
  LinkList p;
  p = L->next;   
  int j = 1;           // 初始化,p指向第一个结点,j为计数器
  while (p && j<i) {   // 顺指针向后查找,直到p指向第i个元素或p为空
    p = p->next;  ++j;
  }
  if ( !p || j>i ) return ERROR;  // 第i个元素不存在
  e = p->data;   // 取第i个元素
  return OK;
} // GetElem_L


Status ListTravel(LinkList L){
	LinkList p=L->next; //跳过头结点

	printf("当前单链表所有元素:");
	while(p != NULL)
	{
		printf("%d ,",p->data);
		p=p->next;
	}
	printf("\n");
}

Status ListInsert(LinkList &L,int index,ElemType e){
	// 在带头结点的单链线性表L的第i个元素之前插入元素e
	int i = 0;
	LinkList in, p = L;  //p指向头结点
	while(p && i < index - 1){  // 寻找 i 的前一个元素 
		p = p -> next;
		i++;
	}
	if (!p)
		return ERROR; 
	in = (LNode *)malloc(sizeof(LNode)); //生成新结点 
	in -> data = e;
	in -> next = p -> next;
	p -> next = in;
	return OK; 
}

Status ListDelete_by_index(LinkList &L,int index,ElemType &e){
	// 删除线性表L的第i个元素并用e返回 
	int i = 0;
	LinkList p = L, q; // p指向L的头结点
	
	while(p && i < index - 1){ // 寻找第i个元素的前一个元素
		p = p -> next;
		i++;
	} 
	if (!p)
		return ERROR;
	// 删除元素
	q = p -> next;
	e = q ->data;
	p -> next = q -> next;
	free(q);  // 释放结点空间 
	return OK;
}

Status ListDelete_by_item(LinkList &L,ElemType item){
	// 按指定值删除,删除第一个为item的值
	
	LinkList p = L, q = L -> next; //p指向头结点,q指向下一个结点
	while (q != NULL && q -> data != item){  //获取与item相同的结点的上一个结点,并用p指向该结点 
		p = q;
		q = q -> next;
	} 
	if (!q)
		return ERROR;
	else if(q -> data == item){
		p -> next = q -> next;
		free(q);
		return OK;
	}
}

Status ListDeleteAll_by_item(LinkList &L,ElemType item){
	// 删除单链表中,所有值为item的结点
	LinkList p = L, q = L -> next;
	while (q != NULL){
		if (q -> data == item){  // 删除结点 
			p -> next = q -> next;
			free(q);
			q =  p -> next;
		}
		else{ // 若不等,指向下一结点 
			p = q;
			q = q -> next;
		}
	} 
}

int main(){
	int e;
	LinkList L = create_LinkList_L(); //以头结点,用头插法建表 
	ListTravel(L);
	
	printf("==========获取第i个元素=========\n");
	GetElem(L,2,e);
	printf("%d\n",e);
	
	printf("==========ListInsert=========\n");
	int flag;
	flag = ListInsert(L,6,10);
	if (flag) ListTravel(L); else printf("没有该位置"); 

	printf("==========ListDelete_by_index=========\n");
	flag = ListDelete_by_index(L,6,e);
	if (flag){
		printf("删除元素为:%d\n",e);
		ListTravel(L);		
	}
	else printf("没有该位置\n");

	printf("==========ListDelete_by_item=========\n");
	int del = 4;
	flag = ListDelete_by_item(L,del);
	if (flag){
		printf("删除元素为%d\n",del);
		ListTravel(L);
	}
	else printf("不存在该值所在的结点\n");

	printf("==========ListDeleteAll_by_item=========\n");
	ListDeleteAll_by_item(L,3);  //删除单链表中所有的3
	ListTravel(L);
}

运行结果:

请输入元素,按空格确认,输入32767则退出输入:
1
2
3
4
5
3
6
7
8
3
9
32767
当前单链表所有元素:9 ,3 ,8 ,7 ,6 ,3 ,5 ,4 ,3 ,2 ,1 ,
==========获取第i个元素=========
3
==========ListInsert=========
当前单链表所有元素:9 ,3 ,8 ,7 ,6 ,10 ,3 ,5 ,4 ,3 ,2 ,1 ,
==========ListDelete_by_index=========
删除元素为:10
当前单链表所有元素:9 ,3 ,8 ,7 ,6 ,3 ,5 ,4 ,3 ,2 ,1 ,
==========ListDelete_by_item=========
删除元素为4
当前单链表所有元素:9 ,3 ,8 ,7 ,6 ,3 ,5 ,3 ,2 ,1 ,
==========ListDeleteAll_by_item=========
当前单链表所有元素:9 ,8 ,7 ,6 ,5 ,2 ,1 ,

--------------------------------
Process exited after 12.49 seconds with return value 0
请按任意键继续. . .
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值