c语言链表排序算法问题

求问有关c语言链表的问题_百度知道
求问有关c语言链表的问题
*新结点的指针为空*/pEnd-&pNext=pN&#47pNew-&*原来的为节点指向新结点*/ pEnd=pN/pNext=NULL;/
pEnd=pNew 这样原来pend中的数据难道没有丢失吗?pend-1为什么就自动指向原先的pend内容了;*pEnd指向新结点*&#47
我有更好的答案
测你这段代码应该是实现的队列(或者基于这种FILO形式的结构),原来的end指向新的end,前者依然在这个链表中(pend已不再指向它,遍历链表是从另一个节点比如pstart开始,而是指向新的end),只是不能从这个新的end节点找到原来的end(所以有这个猜测
采纳率:57%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。C语言实现的 链表求长度问题
[问题点数:20分,结帖人sdkwjc]
C语言实现的 链表求长度问题
[问题点数:20分,结帖人sdkwjc]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2018年2月 C/C++大版内专家分月排行榜第三2017年11月 C/C++大版内专家分月排行榜第三2017年10月 C/C++大版内专家分月排行榜第三2017年9月 C/C++大版内专家分月排行榜第三2017年6月 C/C++大版内专家分月排行榜第三2017年5月 C/C++大版内专家分月排行榜第三2017年4月 C/C++大版内专家分月排行榜第三2017年3月 C/C++大版内专家分月排行榜第三
匿名用户不能发表回复!|22:47 提问
链表问题,这一句为什么是二级指针
#include "stdio.h"
#include "string.h"
#include "ctype.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存储空间初始分配量 */
typedef int S/* Status是函数的类型,其值是函数结果状态代码,如OK等 /
typedef int ElemT/ ElemType类型根据实际情况而定,这里假设为int */
Status visit(ElemType c)
printf("%d ",c);
return OK;
typedef struct Node
struct Node
typedef struct Node *LinkL / 定义LinkList */
/* 初始化顺序线性表 /
Status InitList(LinkList *L)
*L=(LinkList)malloc(sizeof(Node)); / 产生头结点,并使L指向此头结点 /
if(!(*L)) / 存储分配失败 /
return ERROR;
(*L)-&next=NULL; / 指针域为空 */
return OK;
/* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
Status ListEmpty(LinkList L)
if(L-&next)
return FALSE;
return TRUE;
/* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 /
Status ClearList(LinkList *L)
LinkList p,q;
p指向第一个结点 /
没到表尾 /
(*L)-&next=NULL;
/ 头结点指针域为空 */
return OK;
/* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 /
int ListLength(LinkList L)
LinkList p=L-& / p指向第一个结点 */
/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) /
/ 操作结果:用e返回L中第i个数据元素的值 /
Status GetElem(LinkList L,int i,ElemType *e)
/ 声明一结点p /
/ 让p指向链表L的第一个结点 /
j为计数器 /
while (p && j&i)
/ p不为空或者计数器j还没有等于i时,循环继续 /
/ 让p指向下一个结点 /
if ( !p || j&i )
return ERROR;
第i个元素不存在 /
取第i个元素的数据 */
return OK;
/* 初始条件:顺序线性表L已存在 /
/ 操作结果:返回L中第1个与e满足关系的数据元素的位序。 /
/ 若这样的数据元素不存在,则返回值为0 /
int LocateElem(LinkList L,ElemType e)
LinkList p=L-&
if(p-&data==e) / 找到这样的数据元素 */
/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), /
/ 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 /
Status ListInsert(LinkList *L,int i,ElemType e)
LinkList p,s;
while (p && j & i)
/ 寻找第i个结点 /
if (!p || j & i)
return ERROR;
/ 第i个元素不存在 /
s = (LinkList)malloc(sizeof(Node));
生成新结点(C语言标准函数) /
s-&next = p-&
/ 将p的后继结点赋值给s的后继
/ 将s赋值给p的后继 */
return OK;
/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) /
/ 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 /
Status ListDelete(LinkList *L,int i,ElemType *e)
LinkList p,q;
while (p-&next && j & i)
/ 遍历寻找第i个元素 /
if (!(p-&next) || j & i)
return ERROR;
/ 第i个元素不存在 /
p-&next = q-&
/ 将q的后继赋值给p的后继 /
/ 将q结点中的数据给e /
/ 让系统回收此结点,释放内存 */
return OK;
/* 初始条件:顺序线性表L已存在 /
/ 操作结果:依次对L的每个数据元素输出 */
Status ListTraverse(LinkList L)
LinkList p=L-&
visit(p-&data);
printf("\n");
return OK;
随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) /
void CreateListHead(LinkList *L, int n)
srand(time(0));
/ 初始化随机数种子 /
*L = (LinkList)malloc(sizeof(Node));
(*L)-&next = NULL;
先建立一个带头结点的单链表 /
for (i=0; i&n; i++)
p = (LinkList)malloc(sizeof(Node)); /
生成新结点 /
p-&data = rand()%100+1;
随机生成100以内的数字 /
p-&next = (*L)-&
(*L)-&next =
插入到表头 */
随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) /
void CreateListTail(LinkList *L, int n)
LinkList p,r;
srand(time(0));
/ 初始化随机数种子 /
*L = (LinkList)malloc(sizeof(Node)); / L为整个线性表 /
/ r为指向尾部的结点 /
for (i=0; i&n; i++)
p = (Node *)malloc(sizeof(Node)); /
生成新结点 /
p-&data = rand()%100+1;
随机生成100以内的数字 /
r-&next=p;
/ 将表尾终端结点的指针指向新结点 /
/ 将当前的新结点定义为表尾终端结点 /
r-&next = NULL;
/ 表示当前链表结束 */
int main()
LinkList L;
i=InitList(&L);
printf("初始化L后:ListLength(L)=%d\n",ListLength(L));
for(j=1;j&=5;j++)
i=ListInsert(&L,1,j);
printf("在L的表头依次插入1~5后:L.data=");
ListTraverse(L);
printf("ListLength(L)=%d \n",ListLength(L));
i=ListEmpty(L);
printf("L是否空:i=%d(1:是 0:否)\n",i);
i=ClearList(&L);
printf("清空L后:ListLength(L)=%d\n",ListLength(L));
i=ListEmpty(L);
printf("L是否空:i=%d(1:是 0:否)\n",i);
for(j=1;j&=10;j++)
ListInsert(&L,j,j);
printf("在L的表尾依次插入1~10后:L.data=");
ListTraverse(L);
printf("ListLength(L)=%d \n",ListLength(L));
ListInsert(&L,1,0);
printf("在L的表头插入0后:L.data=");
ListTraverse(L);
printf("ListLength(L)=%d \n",ListLength(L));
GetElem(L,5,&e);
printf("第5个元素的值为:%d\n",e);
for(j=3;j&=4;j++)
k=LocateElem(L,j);
printf("第%d个元素的值为%d\n",k,j);
printf("没有值为%d的元素\n",j);
k=ListLength(L); /* k为表长 */
for(j=k+1;j&=k;j--)
i=ListDelete(&L,j,&e); /* 删除第j个数据 */
if(i==ERROR)
printf("删除第%d个数据失败\n",j);
printf("删除第%d个的元素值为:%d\n",j,e);
printf("依次输出L的元素:");
ListTraverse(L);
ListDelete(&L,j,&e); /* 删除第5个数据 */
printf("删除第%d个的元素值为:%d\n",j,e);
printf("依次输出L的元素:");
ListTraverse(L);
i=ClearList(&L);
printf("\n清空L后:ListLength(L)=%d\n",ListLength(L));
CreateListHead(&L,20);
printf("整体创建L的元素(头插法):");
ListTraverse(L);
i=ClearList(&L);
printf("\n删除L后:ListLength(L)=%d\n",ListLength(L));
CreateListTail(&L,20);
printf("整体创建L的元素(尾插法):");
ListTraverse(L);
Status InitList(LinkList L)
*L=(LinkList)malloc(sizeof(Node)); / 产生头结点,并使L指向此头结点 /
if(!(*L)) / 存储分配失败 /
return ERROR;
(*L)-&next=NULL; / 指针域为空 */
return OK;
形参改写成LinkLis L
传递实参写成InitList(La);
实现的初始化操作没什么区别把
为什么要用二级指针呢, 统一成一级指针不好吗?
按赞数排序
一级指针只能修改变量(指针指向的变量)
二级指针可以修改指针(指针的指针指向的指针)
因为你要修改指针指向的地址里面的值,如果用一级指针就和传值调用效果一样
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐关于链表问题【c语言吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:573,225贴子:
关于链表问题收藏
#include &stdio.h&#include &stdlib.h&typedef struct link{struct link *}void create(node **p){int i,node * point1 = NULL, *point2 = NULL;point2 = *p = (node *)malloc(sizeof(node));printf(&Please input number of nodes\n&);scanf(&%d&, &n);printf(&Please input values of nodes\n&);for(i=0; i&n; i++){point1 = (node *)malloc(sizeof(node));scanf(&%d&, &point1-&num);point2-&next = point1;point2 = point1;point1 = point2-&next = NULL;}}void delete(node *p){int i,node *temp = NULL;printf(&Please enter number of node to delete\n&);scanf(&%d&, &n);for(i=0; i&n; i++){temp =p=p-&}if(temp){temp-&next = p-&free(p);}}void change(node *p){int i,printf(&Please enter number of node to change\n&);scanf(&%d&, &n);for(i=0; i&n; i++)p = p-&printf(&Please enter value of node after change\n&);scanf(&%d&, &p-&num);}int query(node *p){printf(&Please enter value of node to see if the node exists.\n&);scanf(&%d&, &n);while(n!=p-&num && p!=NULL)p=p-&if(p)return 1;else return 0;}void print(node *p){printf(&print values of nodes\n&);while((p=p-&next)!=NULL)printf(&%-5d&, p-&num);putchar('\n');}int main(){node *s = NULL;create(&s);delete(s);print(s);change(s);print(s);query(s)? printf(&该节点存在\n&) : printf(&该节点不存在\n&);free(s);return 0;}
如果查找的节点不存在, 就会出错!查询许久, 也不知原因!求助万能的吧友!
无能为力了,发帖就被吞…
登录百度帐号

我要回帖

更多关于 c语言链表详解 的文章

 

随机推荐