<数据结构>单链表的C语言实现

           对于链表的理解,我觉得最主要就是要理解头指针、头结点、第一结点这三者分别是什么以及它们有什么关系。头指针就是指向头结点的指针;头结点是为了更方便的编写代码而引入的,头结点的指针区指向第一个结点,它的数据区随便处理(可以存储链表的长度等,也可什么都不存),第一个结点就是用来存放你所需要存储的信息。

    理解好上面三者的关系,如果你有一定的编程基础,链表的实现应该是不难。

    下面给出我自己写的源代码(仅供参考):

PS:程序简单实现,重在理解知识点,打牢基础。

"init.h":

#ifndef _INIT_H
#define _INIT_H

#include<stdio.h>
#include<stdlib.h>

#define TRUE 1
#define FASLE 0
#define OK 1
#define ERROR -1
#define OVERFLOW -2
typedef int Status;

#endif

"LinkList.h":

#ifndef _LINKLIST_H
#define _LINKLIST_H

typedef char LinkListItemType;

typedef struct LNode
{
	LinkListItemType data;
	struct LNode * next;
}LNode, *LinkList;


//采用头插法创建含有n个元素的单链表
Status create_linklist(LinkList &L, int n);

//显示单链表的元素
Status display_linklist(LinkList L);

//采用尾插法创建单链表
Status create_listlist1(LinkList &L);


#endif

"LinkList.c":

#include"init.h"
#include"LinkList.h"

//采用头插法创建含有n个元素的单链表
Status create_linklist(LinkList &L, int n)
{
	//创建一个空的头结点
	L = (LinkList) malloc(sizeof(LNode));
	L->next = NULL;

	printf("头插法创建单链表,输入元素:\n");
	for(int i = 0; i < n; ++i)
	{
		LinkListItemType c;
		scanf("%c", &c);
		LNode *q = (LinkList)malloc(sizeof(LNode));
		q->data = c;

		q->next = L->next;
		L->next = q;
	}
	return OK;
}


//采用尾插法创建单链表
Status create_listlist1(LinkList &L)
{
	//创建一个空的头结点
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;

	//创建一个尾指针
	LNode * last  = L;

	printf("采用尾插法创建单链表:\n");
	LinkListItemType c = ' ';
	while(c!='\n')
	{
		scanf("%c",&c);
		LNode * p = (LNode*) malloc(sizeof(LNode));
		p->data = c;
		p->next = NULL;

		last->next = p;
		last = p;
	}

	return OK;
}

//显示单链表的元素
Status display_linklist(LinkList L)
{
	//p指向第一个结点的指针
	LNode* p = L->next;
	printf("链表中的元素为:\n");
	while(p)
	{
		printf("%c    ",p->data);
		p = p->next;
	}
	printf("\n");
	return OK;
}

"main.c":

#include"init.h"
#include"Sequence.h"
#include"LinkList.h"

void test_sequence()
{
	SqList L;
	init_sqlist(L);
	insert_list(L,0,'a');
	insert_list(L,1,'b');	
	insert_list(L,2,'c');
	insert_list(L,3,'d');
	insert_list(L,3,'e');
	display_list(L);

	Item e;
	delete_list(L,2,e);
	printf("被删除的元素为: %c\n", e);

	printf("删除元素后,");
	display_list(L);


	SqList La, Lb, Lc;
	init_sqlist(La);
	insert_list(La,0,'a');
	insert_list(La,1,'f');
	insert_list(La,2,'w');
	insert_list(La,3,'z');

	init_sqlist(Lb);
	insert_list(Lb,0,'b');
	insert_list(Lb,1,'c');
	insert_list(Lb,2,'k');
	insert_list(Lb,3,'m');
	insert_list(Lb,4,'o');
	insert_list(Lb,5,'p');
	insert_list(Lb,6,'k');
	insert_list(Lb,7,'x');

	merge_list(La,Lb,Lc);
	printf("合并后,");
	display_list(Lc);

}

void linklist()
{
	LinkList L1;
	create_listlist1(L1);
	display_linklist(L1);

	LinkList L;
	create_linklist(L,5);
	display_linklist(L);

	
}
int main()
{
	linklist();
	return 0;
}

测试结构如下图:


     与大家分享,共同学习,相互提高,如有疑问或建议,请留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值