基本上基础的封装操作都写到了
合并交集并集等做到题就写
#include <stdio.h>
#include <stdlib.h>//C语言动态内存分配所需的头文件
#include <string.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int State;
typedef int ElemType;
//单链表结点的存储结构
typedef struct LNode {
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//两者都是类型,前者表示节点,后者LinkList为指向结构体Lnode的指针类型
//Lnode *p;与LinkList p;两者代表相同的含义都为指向一个节点的指针
//定义链表L:LinkList L,**指向头节点的指针即代表整个链表**
//初始化单链表
State InitLinkList(LinkList *L) { //LinkList *L这里作为头结点与LinkList L作为整个链表加以区分
*L = (LinkList)malloc(sizeof(LNode));//L=new LNode;
if (!*L) return ERROR;
else return OK;
(*L)->data = NULL;
}
//判断单链表是否为空
State IsEmpty(LinkList L) {
if (L->next) return FALSE;
else return TRUE;
}
//获得单链表的长度
State ListLength(LinkList L) {
int i = 0;//计数器i
LinkList p;
p = L->next;//首元节点
while (p){
i++;
p = p->next;
}
return i;
}
//单链表的插入
State InsertList(LinkList *L, int i, ElemType e) {//i为插入位置,e为插入元素
LinkList p;
p = *L;//临时节点p指向头节点
int j = 1;
while (p && j< i-1){//p向后遍历查找
p = p->next;
j++;
}
if (!p) return ERROR;//到结束都无法找到j=i-1,p已经消失
LinkList q;//引入新节点q数据域存储e并插入i位置
q = (LinkList)malloc(sizeof(LNode));
q->data = e;
q->next = p->next;
p->next = q;
return OK;
}
//单链表的删除
State DeleteList(LinkList *L, int i, ElemType e) {//同插入说明e为删除元素
LinkList p;
p = *L;//临时节点p指向头节点
int j = 1;
while (p && j < i-1) {// p向后遍历查找到第i-1个
p = p->next;
j++;
}
if (!p) return ERROR;//到结束都无法找到j=i-1
LinkList q;
q = p->next;
p->next = q->next;//p的下一个即为删除元素直接跳过指针连入下一个
e = q->data;//备份使用
free(q);
return OK;
}
//单链表中元素的查找
State GetElem(LinkList L, int i, ElemType e) {
LinkList p;
p = L ->next;
int j = 1;
while (p && j<i-1){
p = p->next;
j++;
}
if (!p) return ERROR;
e = p->data;//成功查找到赋给e
return i - 1;//所在下标的位置
}
//单链表的创建(头插法)
State HeadCreatList(LinkList *L) {
*L = (LinkList)malloc(sizeof(LNode));//为头结点分配内存
(*L)->next = NULL;//其指针域为空
for (int i = 1; i <= 9; i++){
LinkList p = (LinkList)malloc(sizeof(LNode));//新建节点p并为其分配内存
p->data = i;//数据域一一赋值
p->next = (*L)->next;
(*L)->next = p;//先一后二经典操作
}
return OK;
}
//单链表的创建(尾插法)
State TailCreatList(LinkList* L) {
*L = (LinkList)malloc(sizeof(LNode));
LinkList t;//临时节点以表示尾指针
t = (*L);
for (int i = 5; i < 14; i++) {
LinkList p = (LinkList)malloc(sizeof(LNode));//新建节点p并为其分配内存
p->data = i;
t->next = p;
t = p;//尾指针指向新节点并将新节点作为新的尾指针
t->next = NULL;//循环结束后指向空
return OK;
}
}
//单链表的打印
State PrintLinkList(LinkList L){
LinkList p;
p = L->next;
int i = 1;
while (p){
printf("第%d个结点的元素值为%d\n", i, p->data);
i++;
}
return OK;
}
int main() {
LinkList L1,L2;
int e;
printf("使用头插法创建单链表可得结果为L1:\n");
HeadCreatList(&L1);
printLinkList(L1);
printf("使用尾插法创建单链表可得结果为L2: \n");
TailCreatList(&L2);
printLinkList(L2);
printf("其中L1的长度为%d,L2的长度为%d\n", ListLength(L1), ListLength(L2));
printf("向单链表L1的第三个位置插入一个666元素可得: \n");
InsertList(&L1, 3, 666);
printLinkList(L1);
printf("将单链表L2的第三个元素删除可得: \n");
DeleteList(&L2, 3, &e);
printf("删除的元素为:%d\n", e);
printf("现在的单链表L2为:\n");
printLinkList(L2);
printf("单链表是否存在元素666?存在则返回其位置,不存在则返回0:\n");
printf("单链表L1中666元素的位置为:%d\n", GetElem(L1, 666));
printf("单链表L2中666元素的位置为:%d\n", GetElem(L2, 666));
printLinkList(L1);
}