可能是顺序表研究的细致了一点,单链表操作一下子就实现了。这里先实现带头结点的单链表操作。

大概有以下知识点.

1;结点:结点就是单链表中研究的数据元素,结点中存储数据的部分称为数据域,存储直接后继地址的部分称为指针域。

2;结点示意图:

c语言实现--带头结点单链表操作

3;头指针:头指针始终指向链表第一个元素,当有头结点时头结点就是链表第一个元素。头指针具有标识左右,故头指针命名为链表的名字,这里为linklist。头指针是一定存在的。

4;头结点:引入头结点的目的是,将链表首元结点的插入和删除操作与其他结点的插入和删除操作统一起来。(即头指针地址不在发生变化)

5;单链表结点结构体表示:

1 struct LNode
2 {
3      int data;     //姑且认为其数据为整型
4     struct LNode * next;
5 };
6 
7 typedef struct LNode * linklist

6;单链表的操作集合,头文件 defs.h

 1 #ifndef _DEFS_H_
 2 #define _DEFS_H_
 3 
 4 #include<stdio.h>
 5 #include<stdlib.h>
 6 #include<malloc.h>
 7 
 8 struct LNode                         //单链表结点的定义
 9 {
10     int data;
11     struct LNode * next;
12 }
13 typedef struct LNode * linklist
14 
15                 //操作集合
16 void InitList(linklist *L);  //申请头结点,头指针地址改变
17 void DestroyList(linklist *L);  //须释放头结点,头指针地址改变
18 void ClearList(linklist L);  //保留头结点,头指针地址不变
19 void ListEmpty(linklist L);
20 int ListLength(linklist L);
21 int GetElem(linklist L, int i, int *e);
22 int LocateElem(linklist L, int e);
23 int PriorElem(linklist L, int cur_e, int *pri_e);
24 int NextElem(linklist L, int cur_e, int *nex_e);
25 int ListInsert(linklist L, int i, int e);  //插入不改变头指针的值
26 int ListDelete(linklist L, int i, int *e); //删除操作也不改变头指针的值
27 void TravelList(linklist L);
28 #endif

7;InitList操作实现

 1 #include"defs.h"
 2 
 3 void InitList(linklist *L)   //接受头指针的地址值
 4 {
 5     *L = (linklist)malloc(sizeof(struct LNode));  //*L表示头指针
 6     
 7     if (*L == NULL)
 8      {
 9          printf("分配结点失败。\n");
10          exit(-1);
11      }
12      (*L)->next = NULL;   //置头结点的next域为空
13 }
InitList.c

相关文章: