C语言数据结构链表操作详解
链表也就是线性链
单向链表的结构体指针
typedef struct linknode
{
datatype data;
struct linknode *next;
}Linknode;
data | next |
---|
链表插入:
1.插入指针p之后
① s->next = p->next;
②p->next = s;
2.在指针p之前插入
q = head;
while(q->next != p)
q = q->next;
s->next = q->next;
q->next = s;
链表删除:
q->next = p->next;
delete p;
建立链接②的同时链接①将自动断开
代码
#include<stdio.h>
typedef struct linknode
{
char data; //数据是字符型数据
struct linknode *next;
}Linknode;
Linknode *head;
int n; //n为线性表长度
//建立线性表
void create_link()
{
n = 0;
Linknode *p,*s;
char x;
int z = 1;
head = new Linknode; //C语言中用head = malloc(sizeof(Linknode))
p = head;
printf("\n\t\t请逐个输入结点,以'0'为结束标记!\n");
while(z)
{
scanf("%c",&x);
getchar();
if(x != '0')
{
s = new Linknode;
n++;
s->data = x;
p->next = s;
s->next = NULL;
p = s;
}
else
z = 0;
}
}
//插入结点操作
void insert_list(int i,char x)
{
Linknode *s,*p;
p = head;
int j = 0;
while(p != NULL&&j<i) //判断是否在此结点插入
{
j++;
p = p->next; //指针后移
}
if(p != NULL)
{
s = new Linknode;
s->data = x; //插入结点
s->next = p->next; //修改指针
p->next = s;
n++; //表长增加
printf("\n\t\t结点插入成功!\n");
}
else
printf("\n\t\t线性表为空或者插入位置超出线性表长度!\n");
}
//删除结点操作
void delete_list(char x)
{
Linknode *q,*p;
if(head == NULL)
{
printf("\n\t\t线性表下溢!\n");
return;
}
if(head->next == NULL)
{
printf("\n\t\t线性表为空,无法删除结点!\n");
return;
}
q = head;
p = head->next;
while(p != NULL&&p->data != x)
{
q = p;
p = p->next;
}
if(p != NULL)
{
q->next = p->next;
delete p;
n--;
printf("\n\t\t结点%c已经被删除!\n",x);
}
else
printf("\n\t\t并未找到该结点!\n");
}
//显示线性表
void show()
{
Linknode *p;
p = head;
printf("\n\t\t线性表如下:");
if(head->next == NULL||p == NULL)
printf("\n\t\t线性表为空!");
else
{
printf("\n");
while(p->next != NULL)
{
printf("\t%c\n",p->next->data);
p = p->next;
}
}
}
//查找线性表
void search_list(char x)
{
Linknode *p;
int i = 1;
if(head->next == NULL)
{
printf("\n\t\t线性表下溢!\n");
return;
}
if(head->next == NULL)
{
printf("\n\t\t线性表为空,没有任何结点!\n");
return;
}
p = head->next;
while(p->data != x&&p != NULL)
{
p = p->next;
i++;
}
if(p != NULL)
printf("\n\t\t%c在线性表的第%d个结点!",x,i);
else
printf("\n\t\t并未找到值为%c的结点!",x);
}
void main()
{
head = NULL;
int choice,i,j = 1;
char x;
while(j)
{
printf("\n\t\t***************************************************");
printf("\n\t\t* 线性表子系统 *");
printf("\n\t\t***************************************************");
printf("\n\t\t* 1------建 表 *");
printf("\n\t\t* 2------插 入 *");
printf("\n\t\t* 3------删 除 *");
printf("\n\t\t* 4------显 示 *");
printf("\n\t\t* 5------查 找 *");
printf("\n\t\t* 6------求表长 *");
printf("\n\t\t* 0------返 回 *");
printf("\n\t\t***************************************************");
printf("\n\t\t请选择菜单号:");
scanf("%d",&choice);
getchar();
switch(choice)
{
case 1:
create_link();
break;
case 2:
{
printf("\n\t\t请输入要插入的位置:");
scanf("%d",&i);
printf("\n\t\t请输入要插入的元素:");
getchar();
scanf("%c",&x);
insert_list(i,x);
break;
}
case 3:
{
printf("\n\t\t请输入要删除的数据:");
scanf("%c",&x);
delete_list(x);
break;
}
case 4:
{
if(head == NULL)
printf("\n\t\t请先建立线性表!");
else
show();
break;
}
case 5:
{
printf("\n\t\t请输入需要查找的数据:");
scanf("%c",&x);
search_list(x);
break;
}
case 6:
printf("\n\t\t线性表长度为:%d",n);
break;
case 0:
j = 0;
break;
default:
j = 0;
printf("\n\t\t输入错误!请重新输入!");
break;
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了