69,369
社区成员
发帖
与我相关
我的任务
分享
/*第一版
代码实现功能:
创建任意长度链表,然后再将链表打印出来。没有做输入参数检查*/
#include <stdio.h>
#include <stdlib.h>
/*********创建新的链表**************/
node_list creat_list(int len)
{
node_list head, p;
p = (struct my_node *)malloc(sizeof (node));
head = p;
if (p == NULL)
exit(0);
if (len ==0)
head = NULL;
int i = 1; //计数方便显示
while (len != 0) //循环创建链表
{
printf("请输入链表的第%d个节点的predata和nextdata!\n", i);
scanf("%d%d", &(p->predata), &(p->nextdata));
p = p->next; //循环出去要释放这片内存
p->next = (struct my_node *)malloc(sizeof (node));
len = len-1;
i++;
}
free(p); //释放多申请的那片内存
p = NULL; //设置链表尾部
return head;
}
/******显示函数********/
void printf_list(node_list struct_head)
{
int i = 1;
node_list my_struct_head = struct_head; //保持输入参数不变
if (my_struct_head == NULL)
{
printf("空链表\n");
return;
}
while (my_struct_head != NULL)
{
printf("链表第%d个节点 %d %d\n", i, my_struct_head->predata, my_struct_head->nextdata);
my_struct_head = my_struct_head->next;
i++;
}
return;
}
int main(void)
{
node_list input_listA, input_listB;
node_list output_listC;
unsigned lenA, lenB;
printf("请输入链表 A 的长度:");
scanf("%d", &lenA);
printf("\n");
input_listA = creat_list(lenA);
printf("请输入链表 B 的长度:");
scanf("%d", &lenB);
printf("\n");
input_listB = creat_list(lenB);
printf_list(input_listA);
printf("\n");
printf_list(input_listB);
return 0;
}
/*第二版:
因为问题代码都是链表创建函数的问题,故只对这部分代码做修改*/
node_list creat_list(int len)
{
node_list head, p;
p = (struct my_node *)malloc(sizeof (node));
head = p;
if (p == NULL)
exit(0);
if (len ==0)
head = NULL;
int i = 1; //计数方便显示
while (len != 0) //循环创建链表
{
printf("请输入链表的第%d个节点的predata和nextdata!\n", i);
scanf("%d%d", &(p->predata), &(p->nextdata));
//p = p->next; //循环出去要释放这片内存
p->next = (struct my_node *)malloc(sizeof (node));
p = p->next; //循环出去要释放这片内存 这里有改动
len = len-1;
i++;
}
free(p); //释放多申请的那片内存
p = NULL; //设置链表尾部
return head;
}
/*第三版:
因为问题代码都是链表创建函数的问题,故只对这部分代码做修改*/
node_list creat_list(int len)
{
node_list head, p, tmp;
p = (struct my_node *)malloc(sizeof (node));
head = p;
if (len ==0)
head = NULL;
int i = 1; //计数方便显示
while (len != 0) //循环创建链表
{
printf("请输入链表的第%d个节点的predata和nextdata!\n", i);
scanf("%d%d", &(p->predata), &(p->nextdata));
tmp = p; //相对第二版的改动
p->next = (struct my_node *)malloc(sizeof (node));
p = p->next;
len = len-1;
i++;
}
free(p); //释放多申请的那片内存
tmp->next = NULL; //设置链表尾部
return head;
}
/* 第四版:基于Linux内核单向链表创建
*/
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next;
}listnode, *singly_list;
singly_list init_list(void) //初始化链表,拿到尾部节点
{
singly_list mylist = malloc(sizeof (listnode));
if (mylist != NULL)
{
mylist->next = NULL;
}
else
{
printf("分配内存失败!!!\n");
exit(1);
}
return mylist;
}
singly_list new_node(datatype data, singly_list next) //新的节点放在前面,完美,因为初始化的时候创建的是
{ //尾部节点,故链表的尾部不会出现问题。妙啊
singly_list new = malloc(sizeof (listnode));
if (new != NULL)
{
new->data = data;
new->next = next;
}
else
{
printf("分配内存失败!!!\n");
exit(1);
}
return new;
}