考研C语言数据结构-单链表(线性表的链式存储实现)
作者:互联网
考研C语言数据结构-单链表(线性表的链式存储实现)
#include <stdio.h>
#include <stdlib.h>
// 定义结点数据类型
typedef struct LNode {
int data; // 数据域
LNode* next; // 指针域
}LNode, *LinkList;
// 初始化一个带头结点的单链表
LinkList initLinkList(void) {
LinkList L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
return L;
}
// 头插法创建单链表(逆序)
void headCreateLinkList(LinkList &L, int arr[], int length) {
LNode *p = L;
for(int i = 0;i < length;i++) {
LNode *q = (LNode*)malloc(sizeof(LNode));
q->data = arr[i];
q->next = p->next;
p->next = q;
}
}
// 尾插法创建单链表
void rearCreateLinkList(LinkList &L, int arr[], int length) {
LNode *rear = L;// 定义尾指针指向头结点
for(int i = 0;i < length;i++) {
LNode *p = (LNode*)malloc(sizeof(LNode));
p->data = arr[i];
p->next = NULL;
rear->next = p;
rear = p;
}
}
// 单链表的遍历
void printLinkList(LinkList L) {
LNode *p = L->next;
int i = 1;
while(p != NULL) {
printf("单链表第%d个元素:%d\n", i++, p->data);
p = p->next;
}
}
// 插入操作
bool linkListInsert(LinkList &L, int index, int e) {
if(index < 1)
return false;
LNode *p = L;
int i = 0;// 计数器
while(p != NULL && i < index - 1) {
p = p->next;
i++;
}
if(p == NULL)// p == NULL表明index > L.length + 1 不合理
return false;
LNode *q = (LNode*)malloc(sizeof(LNode));
q->data = e;
q->next = p->next;
p->next = q;
return true;
}
// 删除操作
bool linkListDelete(LinkList &L, int index, int &e) {
if(index < 1)
return false;
LNode *p = L;
int i = 0;// 计数器
while(p != NULL && i < index - 1) {
p = p->next;
i++;
}
if(p == NULL)
return false;
LNode *q = p->next;
p->next = q->next;
e = q->data;
free(q);
return true;
}
// 按位查找
LNode* getElem(LinkList L, int index) {
if(index < 1)
return NULL;
LNode *p = L;
int i = 0;
while(p != NULL && i < index) {
p = p->next;
i++;
}
if(p == NULL)
return NULL;
return p;
}
// 按值查找
LNode* locateElem(LinkList L, int e) {
LNode *p = L;
while(p->next != NULL) {
if(p->next->data == e)
return p->next;
p = p->next;
}
return NULL;
}
// 获取表长
int getLength(LinkList L) {
LNode *p = L;
int i = 0;
while(p->next != NULL) {
p = p->next;
i++;
}
return i;
}
int main(void) {
LinkList L = initLinkList();
int arr[] = {1,2,3,4,5,6};
// 头插法创建单链表
//headCreateLinkList(L, arr, 6);
// 尾插法创建单链表
rearCreateLinkList(L, arr, 6);
printLinkList(L);
printf("\n");
linkListInsert(L, 1, 0);
linkListInsert(L, 8, 7);
printLinkList(L);
printf("\n");
int e = -1;
linkListDelete(L, 1, e);
printf("删除元素e:%d\n", e);
printLinkList(L);
linkListDelete(L, 7, e);
printf("删除元素e:%d\n", e);
printLinkList(L);
LNode * p = getElem(L, 1);
printf("按位查找第1个元素:%d\n", p->data);
p = getElem(L, 6);
printf("按位查找第6个元素:%d\n", p->data);
p = locateElem(L, 1);
printf("按值查找:%d\n", p->data);
p = locateElem(L, 6);
printf("按值查找:%d\n", p->data);
printf("表长:%d\n", getLength(L));
system("pause");
return 0;
}
王道考研相关题目:
部分习题解法:
单链表总结:
标签:NULL,return,LNode,int,线性表,next,LinkList,C语言,考研 来源: https://www.cnblogs.com/dqlai/p/16199648.html