#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
typedef int elemType;
typedef struct Node
{
elemType element;
struct Node *next;
}Node;
Node *l;
//初始化
void init_liat(Node *i)
{
i = NULL;
printf("初始化链表成功\n");
}
///@note创建链表
//p2属于中间变量,用于不停地给p1赋值,l属于head
Node *creat_list()
{
Node *p1, *p2;//p1是尾指针,p2是中间指针,l是首指针
p1 = (Node *)malloc(sizeof(struct Node));
p2 = (Node *)malloc(sizeof(struct Node));
if (p1 == NULL || p2 == NULL)
{
printf("内存分配失败\n");
exit(0);
}
//memset(p1, 0, sizeof(struct Node));
printf("请输入链表中的值");
cin >> p1->element;
p1->next = NULL;
while (p1->element > 0)
{
if (l == NULL)
{
l = p1;
}
else
{
p2->next = p1;
}
p2 = p1;
p1 = (Node *)malloc(sizeof(struct Node));
if (p1 == NULL || p2 == NULL)
{
printf("内存分配失败\n");
exit(0);
}
//memset(p1, 0, sizeof(struct Node));
printf("请输入链表中的值");
cin >> p1->element;
p1->next = NULL;
}
printf("创建表成功\n");
return l;
}
//打印链表
int print_list(Node *i)
{
Node *p = i;
if (NULL == i)
{
cout << "List is null" << endl;
return 0;
}
cout << "print list as flollows" << endl;
while (p != NULL)
{
cout << p->element << endl;
p = p->next;
}
return 1;
}
//清空链表
Node *clear_list(Node *i)
{
Node *p = i;
Node *temp = NULL;
if (p == NULL)
{
printf("链表为空不需要清空\n");
exit(0);
}
while (p != NULL)
{
temp = p->next;
free(p);
p = temp;
}
l = NULL;
if (l == NULL)
{
printf("清空链表\n");
}
return l;
}
//list 的长度
int length_list(Node *l)
{
int cout = 0;
printf("length_list运行成功!\n");
if (l == NULL)
{
printf("list is null");
return 0;
}
while (l != NULL)
{
++cout;
l = l->next;
}
return cout;
}
//获取某个节点的信息
elemType get_pos_element(Node *k, int pos)
{
int i = 1;
if (k == NULL)
{
printf("list is null");
exit(0);
}
if (pos < 1)
{
printf("pause");
exit(0);
}
while (k != NULL)
{
if (i == pos)
{
printf("list %d element is:%d\n", pos, k->element);
return k->element;
}
k = k->next;
++i;
}
printf("no element");
exit(0);
}
//
Node* get_pos_prev_address(Node *l, int pos)
{
Node *prev = NULL;
int i = 0;
if (l == NULL)
{
printf("get_pos_address()运行成功,链表为空, 获取元素失败!\n");
system("pause");
return NULL;
}
if (pos < 1)
{
printf("get_pos_address()运行成功,给定节点数非法, 获取元素失败!\n");
system("pause");
return NULL;
}
while (l != NULL)
{
if (i == pos)
{
printf("get_pos_address()运行成功,第%d个节点元素前一结点的地址为0x%x!\n", pos, l);
return prev;
}
prev = l;
l = l->next;
++i;
}
printf("get_pos_ress()运行成功,超出查找范围!\n");
system("pause");
return NULL;
}
Node * get_element_position(Node *l, elemType x)
{
if (l == NULL)
{
printf("get_element_position运行成功,链表为空, 获取元素失败!\n");
system("pause");
exit(0);
}
while (l != NULL)
{
if (l->element == x)
{
printf("get_element_position运行成功,该链表中元素%d的地址为0x%x\n", x, l);
}
l = l->next;
}
printf("get_element_position运行成功,该链表不含有元素%d\n", x);
return NULL;
}
Node *get_element_prev_position(Node *l, elemType x)
{
Node *prev = NULL;
if (l == NULL)
{
printf("get_element_prev_position运行成功,链表为空, 获取元素失败!\n");
system("pause");
exit(0);
}
while (l != NULL)
{
if (l->element == x)
{
printf("get_element_prev_position运行成功,该链表中元素%d前一结点的地址为0x%x\n", x, l);
return prev;
}
prev = l;
l = l->next;
}
printf("get_element_prev_position运行成功,该链表不含有元素%d\n", x);
return NULL;
}
int modify_element(Node *l, int pos, elemType x)
{
int i=0;
if (l == NULL)
{
printf("modify_element函数运行成功,链表为空, 修改失败!\n");
system("pause");
return 0;
}
if (pos < 1)
{
printf("modify_element函数运行成功,给定节点非法!\n");
system("pause");
return 0;
}
while (l != NULL)
{
if (i == pos)
{
l->element = x;
printf("modify_element函数运行成功,已更换第%d个节点为 %d!\n", pos, x);
return 1;
}
l = l->next;
++i;
}
printf("modify_element函数运行成功,超出查找范围!\n");
system("pause");
return 0;
}
void insert_head_node(Node **l, elemType x)
{
Node *insert_node;
insert_node = (Node *)malloc(sizeof(Node));
insert_node->element = x;
insert_node->next = *l;
*l = insert_node;
printf("insert_head_list运行成功,向表头添加元素%d!\n", x);
}
void insert_end_node(Node **l, elemType x)
{
Node *insert_node, *last = NULL;
Node *p = (*l);
insert_node = (Node *)malloc(sizeof(Node));
while (p != NULL)
{
last = p;
p = p->next;
}
last->next = insert_node;
insert_node->element = x;
insert_node->next = NULL;
printf("insert_end_list运行成功,向末尾添加元素%d!\n", x);
}
int insert_pos_list(Node **l, int pos, elemType x)
{
Node *insert_node = (Node *)malloc(sizeof(Node));
Node *pos_node = get_pos_prev_address(*l, pos);
if (pos_node == NULL)
{
printf("insert_pos_list已运行,但向第%d个节点处添加元素%d时失败,请查看上述提示\n", pos, x);
return 0;
}
insert_node->element = x;
insert_node->next = pos_node->next;
pos_node->next = insert_node;
}
//p为反转后的头,反转link_list
Node *ReverseList(Node *head)
{
if (NULL == head || NULL == head->next)
return head;
Node* p;
Node* q;
Node* r;
p = head;
q = head->next;
head->next = NULL;
while (q){
r = q->next; //
q->next = p;
p = q; //
q = r; //
}
head = p;
print_list(head);
return head;
}
void main()
{
init_liat(l);
creat_list();
print_list(l);
ReverseList(l);
//get_pos_element(l, 2);
system("pause");
}
c单链表基本操作,本人已祥测
最新推荐文章于 2024-09-20 20:44:33 发布