创建带表头结点的单向链表,并实现各种功能
来源:互联网 发布:java调用kettle 编辑:程序博客网 时间:2024/06/05 05:03
程序:
#include <stdio.h>
#include <stdlib.h>
struct node
{
int num;
char name[20];
struct node * next;
};
typedef struct node Node;
typedef struct node * Link; //重命名;
void is_malloc_ok(Link new_node) //判断给new_node分配空间是否成功;
{
if(new_node == NULL)
{
printf("malloc error !\n");
exit(-1);
}
}
void creat_node(Link *new_node)
{
*new_node = (Link)malloc(sizeof (Node));
is_malloc_ok(*new_node);
}
void creat_link(Link *head) //创建一个空链表;
{
// *head = NULL;
creat_node(head);
(*head)->next = NULL;
}
void insert_new_node_head(Link head,Link new_node) //头插;
{
new_node ->next = head ->next;
head ->next = new_node;
}
void insert_new_node_tail(Link head,Link new_node) //尾插;
{
Link p;
p = head;
if(head ->next == NULL)
{
head->next = new_node;
new_node -> next = NULL;
}
else
{
while(p -> next != NULL)
p = p ->next;
p ->next = new_node;
new_node ->next = NULL;
}
}
void display(Link head) //链表的输出;
{
Link p;
p = head->next;
if(head->next == NULL)
{
printf("link is empty !\n");
}
while(p != NULL)
{
printf("num=%d\n",p ->num);
printf("name=%s\n",p ->name);
p = p->next;
}
}
void release(Link head) //释放空间,防止内存空间的泄露;
{
Link p;
while (head->next != NULL)
{
p = head->next;
head->next = p->next;
free(p);
}
}
int output_len(Link head) //求这个链表的长度;
{
Link p;
int len = 0;
p = head->next;
while(p != NULL)
{
len++;
p = p->next;
}
return len;
}
Link check(Link head ,int n) //查找节点;
{
Link p;
p = head->next;
while(p != NULL && p->num != n)
{
p = p ->next;
}
return p;
}
void delete(Link head,int n) //删除链表中的某个节点;
{
Link p;
Link q;
if(head->next == NULL)
{
printf("链表为空\n");
return;
}
else
{
p = head->next;
q = head->next;
if(p->num == n)
{
head->next = p->next;
free(p);
}
else
{
while(p != NULL && p ->num != n)
{
q = p;
p = p->next;
}
if(p != NULL)
{
q ->next = p ->next;
free(p);
}
}
}
}
void nixu(Link head) //将链表逆序;
{
Link p1;
Link p2;
Link p3;
Link p;
p = head->next;
p1 = head->next;
if(p1 == NULL || p1->next == NULL)
{
return;
}
else
{
p2 = p1 ->next;
p3 = p2->next;
if(p3 == NULL)
{
p2->next = p1;
p1->next = NULL;
head->next = p2;
}
else
{
while(p3 != NULL)
{
p2->next = p1;
p1 = p2;
p2 = p3;
p3 = p3->next;
}
p2->next = p1;
p->next = NULL;
head->next = p2;
}
}
}
void input(Link *new_node) //输入,给节点中的变量赋值;
{
creat_node(new_node);
printf("输入num:\n");
scanf("%d",&(*new_node) -> num);
printf("输入name:\n");
scanf("%s",(*new_node) -> name);
}
void insert_new_node(Link head,Link new_node) //按顺序插入一个节点;
{
Link p;
Link q;
p = head->next;
q = head->next;
if(p == NULL)
{
head->next = new_node;
new_node->next = NULL;
}
else
{
if((new_node->num) <= (p->num))
{
new_node->next = p;
head->next = new_node;
}
else
{
if(p->next == NULL)
{
p->next = new_node;
new_node->next = NULL;
}
else
{
while (p != NULL && (p->num) < (new_node->num))
{
q = p;
p = p->next;
}
new_node ->next = p;
q ->next = new_node;
}
}
}
}
int main()
{
Link head = NULL;
Link p;
int i;
int len;
int n;
Link new_node = NULL;
creat_link(&head);
printf("输入链表节点的个数:\n");
scanf("%d",&n);
for(i = 0;i < n;i++)
{
input(&new_node);
//insert_new_node_head(head,new_node);
insert_new_node_tail(head,new_node);
}
display(head);
len = output_len(head);
printf("链表的长度为:%d\n",len);
/* printf("请输入要查询的num:\n");
scanf("%d",&n);
p = check(head,n);
if(p == NULL)
{
printf("未找到此节点\n");
}
else printf("输出num=%d中name为:\n%s\n",n,p ->name);
delete(head,n);
printf("删除第%d个节点\n后输出:\n",n);
display(head);
*/
/* nixu(head);
printf("链表逆序后为:\n");
display(head);
*/
printf("从键盘输入一个要插入的节点:\n");
input(&new_node);
insert_new_node(head,new_node);
display(head);
release(head);
display(head);
return 0;
}
- 创建不带表头结点的单向链表,并实现各种功能
- 创建带表头结点的单向链表,并实现各种功能
- 带表头结点的单向链表
- 不带表头结点的非循环单向链表
- 不带表头结点的单向链表总结
- 带表头的单向链表实现(C语言)
- 带表头的单向链表
- 带表头的单向循环链表
- 不带表头的单向链表,带表头的单向链表,带表头的单向循环链表,带表头的双向循环链表。
- 带表头节点的单向循环链表编程
- 带表头节点的循环单向链表
- 不带表头节点的循环单向链表
- 带表头结点的链表进行栈操作
- 带表头结点的双向循环链表
- 带表头结点的双向循环链表
- 带表头结点的双向循环链表
- 带表头结点的双向循环链表
- 程序功能:建立一个带有头结点的单向链表,并将存储在数组中的字符依次转储到链表的各个结点中。
- 网站的分布式架构
- Mysql解决The total number of locks exceeds the lock table size错误
- Win7 pySpark安装
- AtCoder Grant Contest 10 F - Tree Game 博弈 dfs
- Scala函数字面量
- 创建带表头结点的单向链表,并实现各种功能
- 知识点总结之学习方式
- Gossip算法
- loadrunner 之 Web services 脚本例子
- QT——label
- 飞思卡尔 s19 转 bin
- ORACLE 触发器禁用
- 算法提高 队列操作
- 一致性哈希(Consistent Hashing)