欢迎关注我的微信公众号“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语言知识、代码、编程工具、笔试面试题目等
============================================
正文:
这是一个带头节点的单链表单实现。代码在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语言知识、代码、编程工具、笔试面试题目等
============================================