#include<stdio.h>
#include"malloc.h"
// 单链表结点类型
typedef struct Node
{
int data;
struct Node *next;
} Node,*LinkList; // typedef简化代码编写,将这种结构体重命名为Node,将这种结构体指针变量重命名为LinkList
// 单链表L中p指针所指向的结点后插入新节点
void InsertList(LinkList L, Node *p, int e)
{
Node *pNew; //定义Node指针类型变量pNew
pNew = (Node *)malloc(sizeof(Node)); //动态分配Node数据类型大小的空间,并转换为Node类型地址,由pNew指向该空间的首地址
pNew->data = e;
// 单链表插入操作
pNew->next = p->next;
p->next = pNew;
}
// 删除p指针所指向的结点
void DelNode(LinkList L, Node *p)
{
Node *pre; //用pre指针指向删除节点的前一个结点
pre = L->next;
//找到pre位置
while(pre->next != p)
{
pre = pre->next;
}
// 删除结点p
pre->next = p->next;
free(p);
printf("删除成功!\n");
}
// 查找单链表L中是否有值为e的结点
void SearchNode(LinkList L, int e)
{
Node *p;
int count = 1;
p = L -> next;
while(p)
{
if(p -> data != e)
{
count++;
p = p ->next;
}
else
break;
}
if(p == NULL)
printf("该链表中无值为%d的结点\n", e);
else
printf("查找成功,值为%d的结点是第%d个\n", e,count);
}
// 获取单链表L的长度
int GetLength(LinkList L)
{
int count = 0;
Node *p;
p = L -> next;
while(p)
{
count++;
p = p -> next;
}
return count;
}
//头插法建立单链表L(逆向建立单链表)
LinkList HeadInsertCreat()
{
LinkList L; // 定义表头指针L
Node *p; //新进结点指针p
int x;
//初始化单链表
L = (LinkList)malloc(sizeof(Node));
L -> next = NULL;
scanf("%d", &x);
//设置输入-1为结束标志,重复执行插入操作
while(x != -1)
{
p = (Node *)malloc(sizeof(Node));
p -> data = x;
p->next = L->next;
L->next = p;
scanf("%d", &x);
}
return L;
}
//尾插法建立单链表(正向建立单链表)
LinkList RearInsertCreat()
{
LinkList L;
Node *p, *rear;
int x;
L = (LinkList)malloc(sizeof(LinkList));
L -> next = NULL;
rear = L;
scanf("%d", &x);
while(x != -1)
{
p = (Node *)malloc(sizeof(Node));
p->data = x;
p->next = rear->next;
rear->next = p;
//rear指针后移,保证始终指向最后一个结点
rear = p;
scanf("%d", &x);
}
rear->next=NULL;
return L;
}
//遍历单链表输出单链表的内容
void ViewList(LinkList L, Node *p)
{
p = L->next;
while(p)
{
printf("%-4d",p->data);
p = p->next;
}
printf("\n");
}
main()
{
LinkList L;
Node *p;
L = HeadInsertCreat(); //头插法建立单链表
//L = RearInsertCreat(); // 尾插法建立单链表
printf("该单链表的长度为:%d\n", GetLength(L));
SearchNode(L,6);
// 遍历单链表删除值为4的结点
p = L->next;
while(p->data != 4)
{
p = p->next;
}
DelNode(L,p);
ViewList(L,p);
// 插入值为9的结点
p = L->next;
InsertList(L, p, 9);
ViewList(L,p);
}
C语言-单链表基础操作
最新推荐文章于 2024-07-02 17:44:31 发布