数据结构第二章的链表
//线性表的链式存储
#include <stdlib.h>
#include <stdio.h>
typedef int ElemType;
typedef struct node {
ElemType data;
struct node *next;
} Node, *LinkList;
// 初始化空的单链表
void InitList(LinkList *L) {
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
}
// 头插法建表
void CreateFromHead(LinkList L) {
Node *s;
char c;
int flag = 1;
while (flag) {
c = getchar();
if (c!='$')
{
s = (Node *)malloc(sizeof(Node));
s->data = c; // 直接存储字符
s->next = L->next;
L->next = s;
}
else
flag = 0;
}
}
// 尾插法建表
void CreateFromTail(LinkList L) {
Node *r, *s;
int flag = 1;
r = L;
while (flag) {
char c = getchar();
if(c!='$')
{
s = (Node*)malloc(sizeof(Node));
s->data = c; // 直接存储字符
r->next = s;
r = s;
}
else
{
flag = 0;
r->next = NULL; // 将最后一个结点的next置为空,表示链表结束
}
}
}
// 按值查找
Node *Locate(LinkList L, ElemType key) {
Node *p = L->next;
while (p != NULL) {
if (p->data != key) {
p = p->next;
} else {
return p;
}
}
}
//求单链表长度
int ListLength(LinkList L)
{
Node *p = p->next;
int j = 0;
while (p!=NULL)
{
p = p->next;
j++;
}
return j;
}
// 单链表插入
int InsList(LinkList L, int i, ElemType e) {
Node *pre, *s;
int k;
if (i <= 0) return 0;
pre = L;
k = 0;
while (pre != NULL && k < i - 1) {
pre = pre->next;
k = k+1;
}
if (pre == NULL) {
printf("插入位置不合法\n");
return 0;
}
s = (Node *)malloc(sizeof(Node));
s->data = e; // 修正为 data
s->next = pre->next;
pre->next = s;
return 1;
}
// 单链表删除操作
int DelList(LinkList L, int i, ElemType *e) {
Node *pre, *r;
int k;
pre = L;
k = 0;
while (pre->next != NULL && k < i - 1) {
pre = pre->next;
k=k+1;
}
if (pre->next == NULL || k < i - 1) {
printf("删除位置不合法\n");
return 0;
}
r = pre->next;
pre->next = r->next;
*e = r->data; // 修正为 data
free(r);
return 1;
}
// 打印输出单链表
void print(LinkList L) {
Node *p = L->next;
if (p == NULL) {
printf("空表!\n");
return;
}
while (p != NULL) {
printf("%c ", p->data); // 输出字符
p = p->next;
}
printf("\n");
}
// 逆置链表
void ReverseList(LinkList L) {
Node *prev = NULL, *curr = L->next, *next = NULL;
while (curr != NULL) {
next = curr->next; // 保存下一个节点
curr->next = prev; // 反转当前节点的指针
prev = curr; // 移动 prev 和 curr
curr = next;
}
L->next = prev; // 将头指针指向新的头节点
}
int main() {
LinkList L;
ElemType e;
InitList(&L);
if (L != NULL) printf("初始化成功!\n");
int choice;
while (1) {
printf("\n请选择操作:\n");
printf("1. 头插法创建链表\n");
printf("2. 尾插法创建链表\n");
printf("3. 查找元素\n");
printf("4. 插入元素\n");
printf("5. 删除元素\n");
printf("6. 修改元素(未实现)\n");
printf("7. 逆置链表\n");
printf("8. 打印链表\n");
printf("0. 退出程序\n");
printf("请输入您的选择:");
scanf("%d", &choice);
getchar(); // 清除输入缓冲区的换行符
switch (choice) {
case 1:
CreateFromHead(L);
printf("头插法创建成功!\n");
break;
case 2:
CreateFromTail(L);
printf("尾插法创建成功!\n");
break;
case 3:
printf("请输入要查找的元素:");
scanf("%c", &e);
if (Locate(L, e) != NULL) {
printf("元素 %c 找到!\n", e);
} else {
printf("元素 %c 未找到!\n", e);
}
break;
case 4:
printf("请输入插入的位置和元素(格式:位置 元素):");
int pos;
scanf("%d %c", &pos, &e);
if (InsList(L, pos, e)) {
printf("插入成功!\n");
} else {
printf("插入失败!\n");
}
break;
case 5:
printf("请输入要删除的元素位置:");
scanf("%d", &pos);
if (DelList(L, pos, &e)) {
printf("删除元素:%c\n", e);
} else {
printf("删除失败!\n");
}
break;
case 6:
printf("修改操作尚未实现。\n");
break;
case 7:
ReverseList(L);
printf("链表逆置成功!\n");
break;
case 8:
print(L);
break;
case 0:
printf("退出程序。\n");
return 0;
default:
printf("无效选择,请重试。\n");
}
}
return 0;
}
标签:Node,pre,NULL,C语言,int,next,链表,printf,数据结构
From: https://blog.csdn.net/a3551616800/article/details/143166311