reateList L(LinkList &L, int n)
11建立单链表
GetElem(L, i, &e)//取第i个数据元素
ListInsert(&L.,i,e)//插入数据元素
ListDelete(&L, i, e)
∥删除数据元素
这个网上一搜一大把 整一个资源给你 https://www.iiice.cn/ChatGPT
引用 皆我百晓生 小程序回复内容作答:
单链表的基本操作包括创建链表、获取元素、插入元素和删除元素。
1.创建链表
在C语言中,可以使用结构体和指针来表示单链表。定义一个结构体来表示链表的节点,包含一个数据域和一个指向下一个节点的指针域。创建链表时,需要动态分配内存来存储节点。
typedef struct LNode{
ElemType data; // 数据域
struct LNode *next; // 指针域
}LNode, *LinkList;
LinkList CreateList(LinkList &L, int n){
L = (LNode*)malloc(sizeof(LNode)); // 创建头节点
L->next = NULL; // 头节点的指针域为空
for(int i = n; i > 0; i--){
LNode *p = (LNode*)malloc(sizeof(LNode));
scanf("%d", &p->data); // 输入数据
p->next = L->next; // 插入到头节点后
L->next = p; // 头节点的指针指向新节点
}
return L;
}
2.获取元素
根据传入的索引i,找到链表的第i个节点并获取其中的数据。需要遍历链表,通过指针依次访问节点。
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 || j > i){
return ERROR;
}
e = p->data;
return OK;
}
3.插入元素
根据传入的索引i,在链表的第i个节点之前插入新节点,并设置新节点的数据。需要先找到第i-1个节点,然后将新节点插入到该节点后。
Status ListInsert(LinkList &L, int i, ElemType e){
LNode *p = L;
int j = 0;
while(p && j < i-1){
p = p->next;
j++;
}
if(!p || j > i-1){
return ERROR;
}
LNode *q = (LNode*)malloc(sizeof(LNode));
q->data = e;
q->next = p->next;
p->next = q;
return OK;
}
4.删除元素
根据传入的索引i,在链表中删除第i个节点,并获取其数据。需要先找到第i-1个节点,然后将第i个节点删除,并释放其内存。
Status ListDelete(LinkList &L, int i, ElemType &e){
LNode *p = L;
int j = 0;
while(p->next && j < i-1){
p = p->next;
j++;
}
if(!(p->next) || j > i-1){
return ERROR;
}
LNode *q = p->next;
p->next = q->next;
e = q->data;
free(q);
return OK;
}
注意:在实际使用中,需要在程序结束时手动释放链表的内存,避免内存泄漏。可以通过一个循环,释放链表中每个节点的内存。
供参考:
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct Lnode {
DataType data;
struct Lnode* next;
}ListNode, Node, * LinkList;
void CreateList_L(LinkList& L, int n)
{
DataType i;
LinkList qt = NULL, pL = NULL;
L = (LinkList)malloc(sizeof(ListNode));
if (!L) return;
L->next = NULL;
pL = L;
for (i = 0; i < n; i++)
{
qt = (ListNode*)malloc(sizeof(ListNode));
if (!qt) break;
qt->next = NULL;
scanf("%d", &qt->data);
pL->next = qt;
pL = qt;
}
}
void ListInsert(LinkList &L, int i, DataType e)
{
ListNode* p = L, * s = NULL;
if (i < 1 || !L) return;
while (p->next && i--) p = p->next;
if (i >= 1) return;
s = (ListNode*)malloc(sizeof(ListNode));
if (!s) return;
s->next = NULL;
s->data = e;
s->next = p->next;
p->next = s;
}
void ListDelete(LinkList& L, int i, DataType& e)
{
ListNode* p = L, * s = NULL;
e = -1;
if (i < 1 || !L || !L->next)
return;
while (p->next && --i) p = p->next;
if (!p->next)
return;
s = p->next;
p->next = s->next;
e = s->data;
free(s);
}
void GetElem(LinkList L, int i,DataType &e)
{
Node* p = L;
e = -1;
if (i < 1 || !L || !L->next) return;
while (p->next && --i) p = p->next;
if (!p->next) return;
e = p->next->data;
}
void PrintList(LinkList L)
{
ListNode* p = NULL;
if (!L || !L->next)
printf("NULL");
else {
p = L->next;
while (p != NULL)
{
printf(p == L->next ? "%d" : " %d", p->data);
p = p->next;
}
}
printf("\n");
}
int main()
{
DataType n, i, e;
LinkList L = NULL;
scanf("%d", &n); // 建立链表
CreateList_L(L, n);
PrintList(L); // 输出链表
i = 2; e = 100; // 指定位置 i 插入结点,结点值 e = 100
ListInsert(L, i, e);
PrintList(L); // 输出链表
i = 1; // 删除指定位置 i 的结点
ListDelete(L, i, e);
if (e != -1)
printf("删除结点值为:%d\n", e);
else
printf("删除结点不存在!\n");
i = 5; // 取得指定位置 i 的结点值
GetElem(L, i, e);
if (e != -1)
printf("第%d个结点值为:%d\n", i, e);
else
printf("第%d个结点不存在!\n", i);
PrintList(L);
return 0;
}
【以下回答由 GPT 生成】
首先,我们可以通过使用结构体来表示链表节点。结构体中包含两个部分:一个是用来存储实际数据的数据域,另一个是指向下一个节点的指针域。
// 定义链表节点结构体
typedef struct Node {
int data; // 数据域
struct Node* next; // 指针域,指向下一个节点
} Node;
// 创建链表函数
Node* createLinkedList() {
Node *head = NULL; // 链表头节点指针
Node *tail = NULL; // 链表尾节点指针
// 循环读取数据,并创建新节点进行连接
int data;
while (scanf("%d", &data) != EOF) {
// 创建新的节点
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
// 如果链表为空,将头节点指向新节点
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
// 否则,将尾节点的指针指向新节点
tail->next = newNode;
tail = newNode;
}
}
return head;
}
为了获取链表中第i个数据元素的值,我们可以通过循环遍历链表,直到找到第i个节点。
int getLinkedListElement(Node* head, int i) {
// 遍历链表
Node* p = head;
int count = 0;
while (p != NULL) {
// 如果找到第i个节点,返回节点的数据域值
if (count == i) {
return p->data;
} else {
p = p->next;
count++;
}
}
// 如果链表中没有第i个位置,返回一个特定的值,例如-1
return -1;
}
要在链表中的第i个位置插入一个新的数据元素,我们需要创建一个新节点,并调整节点之间的连接关系。
void insertLinkedListElement(Node* head, int i, int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
// 遍历链表,找到第i-1个节点
Node* p = head;
int count = 0;
while (p != NULL && count < i - 1) {
p = p->next;
count++;
}
if (p != NULL) {
// 将新节点的指针域指向第i个节点
newNode->next = p->next;
// 将第i-1个节点的指针域指向新节点
p->next = newNode;
} else {
printf("插入位置超出链表长度");
}
}
删除链表中的第i个节点时,我们需要找到第i-1个节点,并调整节点之间的连接关系。
void deleteLinkedListElement(Node* head, int i) {
// 遍历链表,找到第i-1个节点
Node* p = head;
int count = 0;
while (p != NULL && count < i - 1) {
p = p->next;
count++;
}
if (p != NULL && p->next != NULL) {
// 保存第i个节点
Node* q = p->next;
// 将第i-1个节点的指针域指向第i+1个节点
p->next = q->next;
// 释放第i个节点的内存空间
free(q);
} else {
printf("删除位置超出链表长度");
}
}
这样,我们就可以通过上述代码实现了使用C语言进行单链表的创建、插入和删除操作。
参考资料: 1. C语言单链表的创建、插入和删除
【相关推荐】