线性表的链式存储(单链表)C语言实现

在顺序表中,我们用一组地址连续的存储单元来依次存放线性表的结点,因此结点的逻辑次序和物理次序是一致的。而链表不一样,链表使用一组任意的存储单元来存放线性表的结点,这组存储单元既可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任何位置上。因此,链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储其后继结点的地址信息。
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node
{
	datatype data;
	struct  node *next;
}linklist;

/*头插法建立单链表,逐个输入字符,以“$”为结束符,返回单链表头指针*/
linklist *CreateListBefore(){
	linklist *head,*s;
	char ch;
	ch = getchar();
	while (ch != '$')
	{
		s =(linklist*) malloc(sizeof(linklist));
		s->data = ch;
		s->next = head;
		head = s;
		ch = getchar();
	}
	return head;
}
/*尾插法建立单链表,返回表头指针,不带头结点*/
linklist* CreatListTail() {
	char ch;
	linklist *head,*s,*rear;
	head = NULL; /*链表初值为空*/
	rear = NULL; /*尾指针初值为空*/
	ch = getchar(); /*读入第一个结点值*/
	while (ch != '$')
	{
		s = (linklist*)malloc(sizeof(linklist));
		s ->data = ch;
		if (head == NULL)
		{
			head = s;	/*新结点*s插入空表*/
		}else
		{
			rear->next = s;	/*非空表,新结点*s插入到尾结点*r之后*/
		}
		rear = s;			/*尾指针*r指向新的表尾*/
	}
	if (rear != NULL)
	{
		rear ->next = NULL;		/*对非空表,将尾结点的指针域置空*/
	}
	return head;
}
/*尾插法建立单链表,返回表头指针,带头结点*/
linklist *CreatListTailOne(){
	char ch;
	linklist *head,*s,*rear;
	head = (linklist*)malloc(sizeof(linklist));	/*生成头结点*/
	rear = head;		/*尾指针初值指向头节点*/
	ch = getchar();		/*读入第一个结点的值*/
	while (ch != '$')
	{
		s = (linklist*)malloc(sizeof(linklist));/*生成新的结点*s*/
		s->data = ch;
		rear->next = s;	/*新结点插入表尾*/
		rear = s;		/*尾指针指向新的表尾*/
		ch = getchar();	/*读入下一个结点的值*/
	}
	rear ->next = NULL; 
	return head;	/*返回表头指针*/
}
/*查找运算,按序号查找*/
linklist *Get(linklist *head,int i){
	int j;
	linklist *temp;
	temp = head;	/*从头开始扫描*/
	j = 0;
	while ((temp ->next != NULL) && (j < i))
	{
		temp = temp ->next;	/*扫描下一个结点*/
		j ++;	/*已扫描结点计数器*/
	}
	if (i == j)	/*找到第i个结点*/
	{
		return temp;
	}else
	{
		return NULL;	/*找不到,i≤0,或i>n*/
	}
}
/*查找运算,按值查找*/
linklist *Loacate(linklist *head,datatype key){
	linklist *temp;
	temp = head ->next;/*从开始结点开始比较*/
	while (temp != NULL)
	{
		if (temp ->data != key)
		{
			temp = temp->next;	/*没有找到继续循环*/
		}else
		{
			break;	/*找到结点key,退出循环*/
		}
	}
	return temp;
}
/*插入运算,后插操作,将值为x的新结点插入到*location之后*/
void InsertAfter(linklist *Loacation,datatype x){
	linklist *temp;
	temp = (linklist*)malloc(sizeof(linklist));
	temp ->data = x;
	temp ->next = Loacation->next;
	Loacation ->next = temp;
}
/*前插操作*/
void InsertBefore(linklist *Location,datatype x){
	linklist *temp =(linklist*)malloc(sizeof(linklist));
	temp->data = Location->data;
	temp->next = Location->next;
	Location ->data = x;
	Location ->next = temp;
}
/*删除操作,*/
void DeleteAferter(linklist *Loaction){
	linklist *temp;
	temp = Loaction->next;
	Loaction->next = temp->next;
	free(temp);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值