#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 带头结点的链式存储
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode, *LinkList; // LNode 表示这个是一个结点, LinkList 表示这个是一个链表
void InitList(LinkList &L)
{
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
}
bool HeadInsertNode(LinkList &L)
{
LNode *p;
int key = 0;
printf("请输入数据元素(999停止输入):");
scanf("%d", &key);
while(key != 999)
{
p = (LNode*)malloc(sizeof(LNode)); // 头插法相当于逆序
if(p == NULL) return false;
p->data = key;
p->next = L->next;
L->next = p;
scanf("%d", &key);
}
return true;
}
bool TailInsertNode(LinkList &L)
{
LNode *r, *p;
r = L; // 在头结点尾部插入
while(r -> next != NULL)
{
r = r->next;
}
int key = 0;
printf("请输入数据元素(999停止输入):");
scanf("%d", &key);
while(key != 999)
{
p = (LNode*)malloc(sizeof(LNode));
if(p == NULL) return false;
p->data = key;
r->next = p;
r = p;
scanf("%d", &key);
}
r->next = NULL;
return true;
}
bool LinkListInsert(LinkList& L, int i, ElemType e)
{
LNode *p;
int j = 0;
p = L;
if (i < 1)
{
return false;
}
while(p != NULL && j < i-1)
{
p = p->next;
j++;
}
if(p == NULL)
{
return false;
}
LNode *q = (LNode*)malloc(sizeof(LNode));
if(q == NULL) return false;
q->data = e;
q->next = p->next;
p->next = q;
return true;
}
bool LinkListDelete(LinkList& L, int i, ElemType& e)
{
LNode* p;
int j = 0;
p = L->next;
if(i < 1)
{
return false;
}
while(p != NULL && j < i - 1)
{
p = p->next;
j++;
}
if(p == NULL)
{
return false;
}
LNode* q;
q = p->next;
e = q->data;
p->next = q ->next;
free(q);
return true;
}
int LinkListLength(LinkList L)
{
int len = 0;
LNode *p = L->next;
while(p != NULL)
{
p = p -> next;
len++;
}
return len;
}
LNode* LocateNode(LinkList L, int i)
{
if (i < 1)
{
return false;
}
LNode *p = L->next;
int j = 0;
while(p != NULL && j < i)
{
p = p->next;
j++;
}
return p;
}
LNode* ValueNode(LinkList L, ElemType e, int& i)
{
LNode* p = L->next;
int j = 0;
while(p != NULL && p->data != e)
{
p = p->next;
j++;
}
i = j + 1;
return p;
}
bool DestoryLinkList(LinkList L)
{
if(L == NULL)
{
return true;
}
LNode* p, *q;
p = L;
while(p != NULL)
{
q = p->next;
free(p);
p = q;
}
return true;
}
void PrintLinkList(LinkList &L)
{
LNode* p = L->next;
while(p != NULL)
{
printf("%d ",p->data);
p = p -> next;
}
printf("打印完成");
}
int main()
{
LinkList L;
InitList(L);
HeadInsertNode(L);
LinkListLength(L);
PrintLinkList(L);
TailInsertNode(L);
PrintLinkList(L);
LinkListInsert(L, 3, 999);
PrintLinkList(L);
ElemType e = 0;
LinkListDelete(L, 5, e);
printf("删除的值%d\n",e);
PrintLinkList(L);
int len = LinkListLength(L);
printf("%d\n", len);
LNode *p = LocateNode(L, 3);
printf("%d", p->data);
int i = 0;
ValueNode(L, 999, i);
printf("下标为%d",i);
PrintLinkList(L);
DestoryLinkList(L);
return 0;
}
带头结点的链表的基本运算
零落@山川2026-06-19 19:54