根据给定的文件信息,我们可以总结出以下关于“单链表程序”的相关知识点: ### 一、单链表概述 单链表是一种线性表的数据结构形式,它通过一组任意的存储单元来存储线性表的数据元素。这些存储单元可以分散在内存中的任何位置上,每个存储单元不仅要存储表中的数据元素,还要存储一个指向其直接后继的指针。单链表的特点是插入和删除操作方便,无需移动元素,只需改变相应的指针即可。 ### 二、单链表的基本操作 #### 1. 初始化单链表 ```c Status InitList_SL(LinkList& l) { l = (LNode*)malloc(sizeof(LNode)); l->next = NULL; return OK; } ``` 初始化单链表的操作主要是在内存中为头结点分配空间,并将头结点的指针域置空。这里定义了`LinkList`类型为`LNode *`类型的指针,`LNode`为单链表节点的结构体类型,包含一个`data`数据域和一个指向下一个节点的指针`next`。 #### 2. 销毁单链表 ```c Status DestoryList_SL(LinkList& l) { LNode *q, *p = l; while (p) { q = p->next; free(p); p = q; } l = NULL; return OK; } ``` 销毁单链表的操作需要遍历整个链表,释放每个节点占用的内存空间,并将头结点置空。 #### 3. 创建单链表(尾插法) ```c Status CreateList_SL(LinkList& l, int n) { LNode *p; printf("%d个元素:\n", n); for (int i = 1; i <= n; i++) { p = (LNode*)malloc(sizeof(LNode)); scanf("%d", &p->data); p->next = l->next; l->next = p; } return OK; } ``` 创建单链表可以通过尾插法实现。该方法从用户输入数据元素开始,依次创建节点并连接到链表尾部。这里采用的是将新节点插入到当前最后一个节点之前的方式构建链表。 #### 4. 获取指定位置元素 ```c Status GetElem(LinkList l, int i, ElemType& e) { LNode *p = l->next; int j = 1; while (p && j < i) { p = p->next; ++j; } if (!p || i > j) return ERROR; e = p->data; return OK; } ``` 获取指定位置的元素需要遍历链表直到找到第`i`个节点,然后返回该节点的数据。 #### 5. 插入指定位置元素 ```c Status ListInsert_SL(LinkList& l, int i, ElemType e) { LNode *p = l, *s; int j = 0; while (p && j < i - 1) { p = p->next; ++j; } if (!p || i - 1 > j) return ERROR; s = (LNode*)malloc(sizeof(LNode)); s->data = e; s->next = p->next; p->next = s; return OK; } ``` 插入指定位置的元素操作需要先找到插入位置的前一个节点,然后调整指针使其指向新创建的节点。 #### 6. 删除指定位置元素 ```c Status ListDelete_SL(LinkList& l, int i, ElemType& e) { LNode *p = l, *q; int j = 0; while (p->next && j < i - 1) { p = p->next; ++j; } if (!p->next || i - 1 > j) return ERROR; q = p->next; p->next = q->next; free(q); return OK; } ``` 删除指定位置的元素需要先找到待删除节点的前一个节点,然后调整指针使其指向被删除节点的后一个节点,并释放被删除节点的空间。 #### 7. 显示链表元素 ```c Status DisplayList_SL(LinkList& l) { LNode *p = l->next; printf("The single list is: "); while (p) { printf("%d ", p->data); p = p->next; } printf("\n"); return OK; } ``` 显示链表元素的操作是遍历整个链表,打印每个节点的数据。 ### 三、单链表的应用示例 ```c int main() { LinkList a; ElemType e; // 初始化单链表 InitList_SL(a); // 创建单链表 CreateList_SL(a, 3); // 显示单链表 DisplayList_SL(a); // 获取指定位置元素 GetElem(a, 2, e); printf("获取的第2个元素为%d\n", e); // 删除指定位置元素 ElemType elem = 332; ListDelete_SL(a, 3, e); printf("删除第3个元素后:"); DisplayList_SL(a); // 插入指定位置元素 ListInsert_SL(a, 2, elem); printf("插入第2个位置的元素%d:", elem); DisplayList_SL(a); return 0; } ``` 此示例展示了如何使用上述基本操作来实现对单链表的操作,包括初始化、创建、显示、获取、删除以及插入元素等。通过这些操作,可以有效地管理和利用单链表这一重要的数据结构。
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode,*LinkList;
/*
单链表初始化操作,带头结点(头结点不存储数据,统一操作)
*/
Status InitList_SL(LinkList& l) {
l=(LNode*)malloc(sizeof(LNode));
l->next=NULL;
return OK;
}
/*
单链表销毁操作
*/
Status DestoryList_SL(LinkList& l) {
LNode *q,*p=l;
while(p) {
q=p->next;
p=q;
}
l=NULL;
return OK;
}
/*
单链表头插法
*/
Status CreateList_SL(LinkList& l,int n) {
LNode* p;
printf("请输入 %d 个数构造单链表:\n",n);
for(int i=1;i<=n;i++) {
p=(LNode*)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=l->next;
l->next=p;
}
return OK;
}
/*
取出第 i 号位元素,用 e 带回
*/
Status GetElem(LinkList l,int i,ElemType& e) {
LNode* p=l->next;
int j=1;
while(p&&j
p=p->next;
++j;
剩余5页未读,继续阅读
- 粉丝: 0
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助