网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
05月30日漏签0天
数据结构吧 关注:104,525贴子:883,707
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 0回复贴,共1页
<<返回数据结构吧
>0< 加载中...

「原创」单链表实现代码(链表建立、查找、插入、删除)

  • 只看楼主
  • 收藏

  • 回复
  • jerrylauyw
  • 单链表
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
欢迎关注我的微信公众号“C语言修仙”
正文:
这是一个带头节点的单链表单实现。代码在VC6.0下编写的。工程包含三个文件:slist.h、slist.c、main.c
,分别是单链表头文件、单链表函数实现源文件、主函数源文件。
代码完全我自己手打。
话不多说,贴上代码:(另外,大家可以在我单公众号后台,回复“单链表,获取完整的VC工程文件下载链接”)
*************************************************************slist.h****************************************
//带头节点单单链表
struct slist_node{
int data;
slist_node * next;
};
struct slist{
slist_node * head;
int lenth;
};
//把一个数组的数据,建立一个单链表,
void init(slist * list, int *a, int len);
void display(slist * list);
//查找一个元素,返回index索引
int find(slist * list, int data);
//在链表的任意位置添加一个元素
void add_element(slist * list, int data, int pos);
//删除第pos个位置单节点
bool delete_element(slist * list, int pos);
//排序。采用冒泡排序法,从小达到排序。
bool sort(slist * list);
***********************************************************slist.cpp
# include"slist.h"
# include<stdio.h>
# include<stdlib.h>
void init(slist * list, int *a, int len)
{
// slist * tmp_list = (slist *)malloc(sizeof(struct slist));
slist_node * phead = (slist_node *)malloc(sizeof(struct slist_node));
printf("建立单链表: \n");
phead->data = -1;
phead->next = NULL;
list->head = phead;
list->lenth =len;
slist_node * tmp_node = NULL;
for (int i = 0; i<len ; i++){
slist_node * node = (slist_node *)malloc(sizeof(struct slist_node));
node->data = a[i];
printf("%d, ", node->data);
node->next = NULL;
if(i ==0)
phead ->next = node;
else
tmp_node -> next = node;
tmp_node = node;
}
printf("\n\n");
}
void display(slist * list)
{
if (list->head == NULL){
printf("error: 链表是空的\n");
return;
}
struct slist_node* phead = list->head;
struct slist_node* p = phead->next;
printf("\n\n打印链表单元素值 :\n");
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n\n\n");
}
int find(slist * list, int data)
{
struct slist_node * p = list->head->next;
int index = 1;
printf("在链表中查找数字%d.", data);
while(p){
if (data == p->data){
printf("\n找到%d了, 位置是 index = %d\n\n",data, index);
return index;
}
else{
index++;
p = p->next;
}
}
printf("链表中没有 %d\n", data);
return -1;
}
//在第pos个位置插入data;
//设定第一个元素之前的位置是0.第一个元素之后的位置置是1;
void add_element(slist * list, int data, int pos)
{
if (!list || !(list->head) || !(list->head->next))
printf("error\n");
struct slist_node * p = list->head;
struct slist_node * q = list -> head -> next;
struct slist_node * node =(slist_node * ) malloc(sizeof(struct slist_node));
node ->data = data;
node ->next = NULL;
if (pos == 0){
p -> next = node;
node -> next = q;
list ->lenth ++;
}else if(pos == list->lenth){
while(p->next)
p = p->next;
p->next = node;
}else{
p = list->head;
for(int i = 0; i < pos; i ++){
p = p->next;
}
q = p->next;
p->next = node;
node -> next = q;
}
}
//删除链表中第pos个节点
bool delete_element(slist * list, int pos)
{
if (list == NULL || list->head == NULL)
return false;
if(pos > list->lenth)
return false;
struct slist_node * p = list->head;
struct slist_node * q = p->next;
struct slist_node * r = NULL;
struct slist_node * tail = NULL;
printf("删除第%d个节点:\n", pos);
if (pos == 1){
list->head->next = q;
}else if(pos == list->lenth){
//获取倒数第二个节点和尾节点
while (p->next->next){
p = p->next;
}
tail = p ->next;
p->next = NULL;
}else{
for (int i = 1; i < pos; i++){
p = p->next;
}
//q是要删除的节点
q = p->next;
r = q->next;
p->next = r;
}
list->lenth--;
return true;
}
bool sort(slist * list)
{
printf("将链表按data从小到大单顺序进行排序排序\n");
if (list->lenth == 1)
return true;
struct slist_node * p = list->head;
struct slist_node * q = p->next;
struct slist_node * r = p;
struct slist_node * s = q;;
int j = list->lenth;
for (int i = 1; i<j; i++){
r = p;
s = q;
while (j - i){
//如果前一个节点单数据比后一个的大,那么交换数据。
if (r->data > s->data){
int tmp = r->data;
r->data = s->data;
s->data = tmp;
}
r = r->next;
if(r->next == NULL)
break;
else
s = s->next;
}
p = p->next;
q = q->next;
}
return true;
}
********************************************************main.cpp *****************************************
#include "slist.h"
# include<stdio.h>
# include<stdlib.h>
int main()
{
int a[5] = {9, 0, 33, 100, 7};
slist * my_list = (slist*)malloc(sizeof(struct slist));
//1.由数据a[5]建立单链表
init(my_list, a, 5);
display(my_list);
//2.查找数字100在单链表中单位置
int index = find(my_list, 100);
//3.在第3个节点后面,添加元素999
add_element(my_list, 999, 3);
display(my_list);
//4.删除第三个节点
delete_element(my_list, 3);
display(my_list);
//5.从小到大排序
sort(my_list);
display(my_list);
}
============================================
欢迎关注我的微信公众号:C语言修仙
分享你更多单C语言知识、代码、编程工具、笔试面试题目等
============================================


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 0回复贴,共1页
<<返回数据结构吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示