跪求 在创建链表的子函数里开辟空间不成功,该怎么办

aprogramming 2019-05-11 08:57:11
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>


#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0

typedef unsigned char STATUS;


/*定义结点类型*/
typedef struct NODE
{
int Number; /*编号*/
char Name[20]; /*姓名*/
struct NODE *next; /*指针域*/
} NODE, *LINK_LIST;

/*尾插法建立(带头结点的)单链表*/
STATUS LinkedListCreatT(LINK_LIST L, int NodeNum)
{
LINK_LIST p;/*临时结点指针*/
LINK_LIST r;/*指向最后一个结点的指针*/
int i;

/*初始化一个带头结点的空链表*/
L = (LINK_LIST)malloc(sizeof(NODE)); /*申请头结点空间*/

if(L == NULL);
{
return ERROR;
}
p->next = NULL;
L->next= r;
r = L;/*r先指向头结点*/

/*尾插法插入NodeNum个新节点*/
printf("请依次输入%d个结点的信息,先学号,后姓名,学号和姓名用空格隔开,姓名后输入回车\n",NodeNum);
for(i=1; i<=NodeNum; i++)
{
p = (LINK_LIST)malloc(sizeof(NODE)); /*申请一个结点的空间*/
if(p == NULL)
{
return ERROR;
}
printf("第%d个:",i);
scanf("%d", &(p->Number));
scanf("%s", p->Name);
r->next = p;
p->next=NULL;
r = p;
}
/*最后一个结点的next指向NULL*/
r->next = NULL;
printf("%d个结点的信息输入结束,链表创建成功!\n",NodeNum);
/*返回成功*/
return OK;
}

/**************************************************************************/
/* */
/**************************************************************************/
void LinkedListPrint(LINK_LIST L)
{

NODE *start;
printf("当前各个结点的信息依次如下所示:\n");
for(start = L->next; start != NULL; start = start->next)
{
printf("%d %s \n", start->Number, start->Name);
}
}

/*单链表的插入,在链表的第i个位置插入x的元素*/
STATUS LinkedListInsert(LINK_LIST L, int i, int x,const char *Name)
{
NODE *pre;/*pre为插入位置的前驱结点指针*/
int tempi;/*定义计数器,便于查找第i个位置*/
NODE *p;
p=(NODE*)malloc(sizeof(NODE));
/*查找第i个位置的前驱结点*/
pre = L;
for (tempi = 1; tempi < i; tempi++)
{
pre = pre->next;
}

/*为新插入的结点p赋值*/
p->Number = x;
strcpy(p->Name,Name);
/*将新节点p加入到链表中*/
p->next = pre->next;
pre->next = p;

return OK;
}

/*单链表的删除,在链表中删除第x个元素*/
STATUS LinkedListDelete(LINK_LIST L, int x)
{

NODE *pre, *q; /*pre为前驱结点,q为待删除的结点*/
int j;

pre = L;
j = 0;

while( (pre->next!=NULL)&&(j < x - 1) )
{
//寻找第x个结点,并令pre指向其前驱
pre = pre->next;
++j;
}

/*防错代码,处理未找到该位置的情况,如果无错说明pre指向待删除节点的前驱节点*/
if ( (pre->next=NULL) || (j > x - 1) )
{
return ERROR;
}


q = pre->next;//q指向待删除节点
pre->next = q->next; //链表中跳过节点q,实现删除节点的目的
free(q);//释放结点q指向的空间

return OK;
}

/*销毁链表(释放包括头结点在内的所有节点的空间)*/
STATUS DestroyLinkedList(LINK_LIST pList)
{
LINK_LIST p, q;
p = pList;
while(p != NULL)
{
q = p->next;
free(p);
p = q;
}
return OK;
}

int main(void)
{
LINK_LIST pList;
pList=(LINK_LIST)malloc(sizeof(NODE));
STATUS temp;
int InitLen = 1;/*初始化时的结点数量*/
int InsertPlace = 1;

printf("请输入初始化时的结点数量:");
scanf("%d",&InitLen);
printf("\n");

/*尾插法建立(带头结点的)单链表,手动输入各节点的数据(共5个结点)*/
temp = LinkedListCreatT(pList, InitLen);
if(temp == 0)
{
printf("创建链表失败!\n");
return ERROR;
}

/*打印各节点的数据*/
LinkedListPrint(pList);

/*插入一个节点,并再次打印各节点的数据*/
/*计算插入位置*/
InsertPlace = ((InitLen/2)>=1)?(InitLen/2):(1);
/*插入元素*/
temp = LinkedListInsert(pList, InsertPlace, 10, "Zhang San");
if(temp == ERROR)
{
printf("链表插入失败!\n");
return ERROR;
}
printf("链表插入成功! ");
/*打印各节点的数据*/
LinkedListPrint(pList);

/*删除一个节点,并打印各节点的数据*/
temp = LinkedListDelete(pList, 2);
if(temp == ERROR)
{
printf("链表删除失败!\n");
return ERROR;
}
printf("链表删除成功! ");
/*打印各节点的数据*/
LinkedListPrint(pList);

/*销毁该链表*/
DestroyLinkedList(pList);
pList = NULL;

return OK;
}
...全文
127 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
拥抱Linux 2019-05-11
  • 打赏
  • 举报
回复
引用 4 楼 aprogramming 的回复:
这是我第一次注册这个,哈哈还不太会使,没想到十分钟就有人回我了,谢谢辽!1


今天正好下午吃过晚饭在论坛里逛,看到你的帖子就点进来看了一下。
只要发的帖子不是太水、不是纯伸手帖之类的,一般都会有热心的网友愿意提供力所能及的帮助的。
祝C语言学习顺利!
aprogramming 2019-05-11
  • 打赏
  • 举报
回复
引用 1 楼 拥抱Linux 的回复:
其它的还没看,单单说一个已经看到了的问题:函数 「STATUS LinkedListCreatT(LINK_LIST L, int NodeNum)」里,下面的代码部分,if()的后面 多了一个 分号
先把多余的 这个 分号 删了 再 调试吧。

/*初始化一个带头结点的空链表*/
L = (LINK_LIST)malloc(sizeof(NODE)); /*申请头结点空间*/

if (L == NULL)
;
{
return ERROR;
}

~[/quote

[quote=引用 3 楼 拥抱Linux 的回复:]
[quote=引用 2 楼 aprogramming 的回复:]
嗷嗷嗷!!!!!!太感谢了!这一个封号卡了我快1小时


喵喵喵~ 如有帮助,烦请及时结帖、给分哟! :)
(比心~)[/quote]
这是我第一次注册这个,哈哈还不太会使,没想到十分钟就有人回我了,谢谢辽!1
拥抱Linux 2019-05-11
  • 打赏
  • 举报
回复
引用 2 楼 aprogramming 的回复:
嗷嗷嗷!!!!!!太感谢了!这一个封号卡了我快1小时


喵喵喵~ 如有帮助,烦请及时结帖、给分哟! :)
(比心~)
aprogramming 2019-05-11
  • 打赏
  • 举报
回复
嗷嗷嗷!!!!!!太感谢了!这一个封号卡了我快1小时
拥抱Linux 2019-05-11
  • 打赏
  • 举报
回复
其它的还没看,单单说一个已经看到了的问题:函数 「STATUS LinkedListCreatT(LINK_LIST L, int NodeNum)」里,下面的代码部分,if()的后面 多了一个 分号
先把多余的 这个 分号 删了 再 调试吧。

/*初始化一个带头结点的空链表*/
L = (LINK_LIST)malloc(sizeof(NODE)); /*申请头结点空间*/

if (L == NULL)
;
{
return ERROR;
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧