#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode {
ElemType data; //数据域
struct LNode *next; //指针域
} LNode;
//头插法建立单链表
LNode* List_HeadInsert(LNode *L) {
int x;
LNode *s;
L = (LNode*) malloc(sizeof(LNode)); //创建头结点
L->next = NULL; //将头结点指针置为NULL
scanf("%d", &x); //输入结点的值
while (x != 999) { //输入999表示结束
s = (LNode*) malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d", &x);
}
return L;
}
//尾插法建立单链表
LNode* List_TailInsert() {
int x;
LNode *L = (LNode*) malloc(sizeof(LNode)); //创建头指针
LNode *s;
LNode *r = L; //r为表尾指针
scanf("%d", &x); //输入节点的值
while (x != 999) { //输入999表示结束
s = (LNode*) malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s; //r指向新的表尾节点
scanf("%d", &x);
}
r->next = NULL; //尾结点的指针置为空
return L;
}
//单链表按序号查找
LNode* GetElem(LNode *L, int i) {
int j = 1;
LNode *p;
p = L->next; //将头结点指针赋给p
if (i == 0)
return L;
if (i < 1)
return NULL;
while (p != NULL && j < i) { //当i等于1时,直接返回p
p = p->next;
j++;
}
return p;
}
//单链表插入元素
void ListInsert(LNode *L, int i, int e) {
LNode *p;
p = GetElem(L, i - 1); //查找插入位置的前驱结点
LNode *s;
s = (LNode*) malloc(sizeof(LNode));
s->next = p->next;
p->next = s;
s->data = e;
}
//删除节点
void ListDelete(LNode *L, int i) {
LNode *p, *q;
p = GetElem(L, i - 1); //查找到删除位置的前驱结点
q = p->next; //令q指向被删除结点
p->next = q->next; //将*q结点从链中断开
free(q); //释放结点的储存空间
}
//遍历链表
void PrintList(LNode *L) {
LNode *p;
p = L->next;
while (p->next != NULL) {
printf("%d ", p->data);
p = p->next;
}
if (p->next == NULL) { //输出最后一个元素
printf("%d ", p->data);
}
}
//单链表的按值查找
LNode* LocateElem(LNode *L, int e) {
LNode *p;
p = L->next;
while (p != NULL && p->data != e)
p = p->next;
return p;
}
int main() {
//初始化链表,尾插法
LNode *ln = List_TailInsert();
PrintList(ln);
printf("\n");
//删除元素
ListDelete(ln, 2);
PrintList(ln);
printf("\n");
//插入元素
ListInsert(ln, 2, 2);
PrintList(ln);
}
单链表 C语言版
最新推荐文章于 2024-10-30 16:53:07 发布