对于链表的理解,我觉得最主要就是要理解头指针、头结点、第一结点这三者分别是什么以及它们有什么关系。头指针就是指向头结点的指针;头结点是为了更方便的编写代码而引入的,头结点的指针区指向第一个结点,它的数据区随便处理(可以存储链表的长度等,也可什么都不存),第一个结点就是用来存放你所需要存储的信息。
理解好上面三者的关系,如果你有一定的编程基础,链表的实现应该是不难。
下面给出我自己写的源代码(仅供参考):
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;
}
测试结构如下图:
与大家分享,共同学习,相互提高,如有疑问或建议,请留言。