c语言数据结构创建链表问题

wenli103 2010-04-18 04:45:46
#include<stdio.h>
#include<math.h>
#include<malloc.h>

typedef struct node{
char data;
struct node *next;
}LinkList;

LinkList *create(){
LinkList *h,*p,*q;
h=(LinkList *)malloc(sizeof(LinkList));
p=h;
char ch;
ch=getchar();
while(ch != '#'){
q=(LinkList *)malloc(sizeof(LinkList));
q->data=ch;
p->next=q;
p=q;//这句什么意思,最好整段全部解释下,数据结构一直不怎么懂
//p的下一个节点已经指向q,为什么要把q赋给p
ch=getchar();
}
p->next=NULL;
return h;
}
...全文
708 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenli103 2010-04-28
  • 打赏
  • 举报
回复
谢谢大家耐心的回答,我明白了
wuliao000 2010-04-23
  • 打赏
  • 举报
回复
指针连动,如果p不动新结点就会不断挂在p上,上个结点就会丢失
brk1985 2010-04-23
  • 打赏
  • 举报
回复
你的程序里的 p=q; 等价于 P++、P=P->next,意思是指针后移一位,指向尾结点。很基础哟
ljia0 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 wenli103 的回复:]
C/C++ code
#include<stdio.h>
#include<math.h>
#include<malloc.h>

typedef struct node{
char data;
struct node *next;
}LinkList;

LinkList *create(){
LinkLis……
[/Quote]
你这个是通过一个一个元素从后面插入的方法创建链表的算法,h头结点指针,p是链表的指针,q指向要插入的结点指针。
p=q;//这句什么意思,最好整段全部解释下,数据结构一直不怎么懂
//p的下一个节点已经指向q,为什么要把q赋给p
这是让p在插入了一个结点后再往后移一位,其实就是尾结点,使下一个结点的插入不用再查找要插入的位置,而直接插入到p指向的结点后面。
michael122 2010-04-19
  • 打赏
  • 举报
回复

//L是头结点,p是尾结点
while(ch != '#'){
q=(LinkList *)malloc(sizeof(LinkList)); //要新加一个节点,先申请一个节点空间
q->data=ch; //给新节点赋值
p->next=q; //然后把q链接到链表尾部
p=q; //这句的意思是把q作为新的尾节点

ch=getchar();
}
p->next=NULL; //全部加完以后把尾节点的next指针置空
return h; //返回头节点
}

很基础,lz再看看书吧
xinzaiyiqi 2010-04-18
  • 打赏
  • 举报
回复
最后返回h,就像我刚才讲的,h是头指针。你的初始化函数返回类型是LinkList,即链表节点指针。知道了头指针h,就可以通过链表的特点p=p->next,完成各种操作了,链表就建立了。OK?
xinzaiyiqi 2010-04-18
  • 打赏
  • 举报
回复
h是头结点指针,是不变的。q是新创建的节点的指针,q=(LinkList *)malloc(sizeof(LinkList));q->data=ch;则新节点创建完毕。p是指向当前链表最后一个的节点的指针。 p->next=q; 这句使q节点插入到链表中。p=q;使p指向当前链表最后一个节点即p喽。
明白了吗?

wenli103 2010-04-18
  • 打赏
  • 举报
回复
我还是不怎么明白h,p,q的关系,谁能详细讲讲吗,为什么最后返回h,我感觉数据都是存在p的
大明哥_ 2010-04-18
  • 打赏
  • 举报
回复
q=(LinkList *)malloc(sizeof(LinkList)); //申请节点
q->data=ch; //数据域赋值
p->next=q; //将q这个结构连接到链表中去。
p=q; // 将p移到p这个结构体的位置。此
p指向q这个位置。
ch=getchar();
}
p->next=NULL;
return h;
我也才刚学数据结构。下面是我编的单链表:

// SqTest0316.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdlib.h>

//定义节点数据结构
typedef struct Node{
int date; //数据域
Node * next; //指针域
}*Plist;


//初始化链表

void InitNode(Plist &ls)
{
ls = (Node*)malloc(sizeof(Node)); //申请节点
ls->next = 0;
ls->date = 0;
return;
}

//创建链表

void CreateNode(Plist &ls)
{
int number ;
Plist p;
scanf("%d",&number);
do{
//采用前插方法 //后插法是?
p=(Plist)malloc(sizeof(Node)); //申请节点部分
p->date=number;
p->next = 0;
//插入部分
p->next = ls->next;
ls->next = p;
scanf("%d",&number);
}while(number!=-1);

}

/*// 遍历链表

void printfNode(Plist &ls)
{
Plist p=ls->next;
while(p->next!=0){
printf("%d ",p->date);
p=p->next;
}
}*/

//遍历链表

void PrintfNode(Plist &ls)
{
Plist p=ls->next;
int i=1;
while(1)
{
printf("第%d个元素为:%d\n",i,p->date);
if(p->next==0)
break;
p = p->next;
i++;

}
return;
}

//插入

void InsertNode(Plist &ls,int i,int e)
{
Plist p=ls,q;
int j=0; //计时器
//寻找i的位置
while(j<i-1){
p=p->next;
j++;
}

q=(Plist)malloc(sizeof(Node));
q->date=e;
q->next=p->next;
p->next=q;
printf("插入一个数字后:");
p=ls->next;
while(1)
{
printf("%d ",p->date);
if(p->next==0)
break;
p = p->next;
}
}


//删除

void DeleteNode(Plist &ls,int number)
{
Plist p=ls,q;
for(;p->next!=0;p=p->next){
if(p->next->date==number){
q=p->next;
p->next=q->next;
break;
}
}
printf("删除该节点后:");
for(p=ls->next;p->next!=0;p=p->next)
printf("%d ",p->date);
printf("%d ",p->date);
}

//查找

int SearchNode(Plist &ls,int number)
{
int e=0;
Plist p=ls;
for(;p->next!=0;p=p->next,e++){
if(number==p->date)
return e;
}
if(p->next==0)
return 0;
}


int main(int argc, char* argv[])
{

Plist ls;
InitNode(ls);
printf("date=%d\n",ls->date);
printf("next=%d\n",ls->next);

//创建函数
printf("请输入一串数字(以-1作为结束条件):");
CreateNode(ls);
PrintfNode(ls);

//插入函数
int number ,i;
printf("请输入你要插入的数:");
scanf("%d",&number);
printf("请输入你要插入的位置:");
scanf("%d",&i);
InsertNode(ls,i,number);
printf("\n");

//删除函数
int e;
printf("请输入你要删除的数:");
scanf("%d",&e);
DeleteNode(ls,e);
printf("\n");

//查找
int m,n;
printf("请输入你要查找的数:");
scanf("%d",&m);
n=SearchNode(ls,m);
if(n==0)
printf("该单链表中没有该数!");
else
printf("%d在该链表中的位置是:第%d元素",m,n);
printf("\n");
return 0;
}
GentooEmacs 2010-04-18
  • 打赏
  • 举报
回复
看一下我以前写的一个创建链表的源代码:
#include<iostream.h>
*/
/************结点的定义**********
****/
typedef struct node
{
int data; //数据部分
struct node* next; //指针部分,用于指向下一个节点
}*Link_List;//定义一个Link_List指针,因为前面有个*,注意这个有个分号,与定义一个类相似
//********单链表的实现*** 整个链表的核心 **********
Link_List Create_LinkList()//返回链表指针
{
Link_List p,q,head;
p=new node; //动态分配内存空间//而在c语言中是用malloc函数实现的(注意:new
//是操作符,而malloc是函数,两个是截然不同的概念.
cout<<"请输入数字,以空格建分开,以0结束!!\n";
cin>>p->data;
head=p;//保存创造的第一个结点,即是头节点
while(p->data) //如果输入的数字p->data为零,则退出循环
{
q=p;//保存临时创建的结点,以便下面的指针链接:q->next=p;即,
//q结点的指针域指向下一个结点p
//因为下面再创建新节点时p的地址有变化了,所以要保存起来。
/*******/p=new node;///创造新节点///
/*******/cin>>p->data;//为新创造的结点赋值///

q->next=p;//链接指针,即是把刚创造的结点链接上
q->next=NULL;//注意最后一个指针的next一定要赋值NULL,否则一个链表就没有结尾了
return head;// 返回创造的链表的头指针
}
void print(Link_List l)
{
while(l)
{
cout<<l->data<<" ";
l=l->next;//再让l指向下一个节点;
}
cout<<endl;
}
void main()
{
Link_List list=Create_LinkList();//让函数返回的链表头指针赋值给list;
print(list);//打印创建的链表
}
GentooEmacs 2010-04-18
  • 打赏
  • 举报
回复
p=q;//这句什么意思,最好整段全部解释下,数据结构一直不怎么懂
//p的下一个节点已经指向q,为什么要把q赋给p
;//保存临时创建的结点,以便下下一次的指针链接:p->next=q;否则,下次在链接节点时,上一次的节点就找不到了,因为你又重新申请了一个节点,q=(LinkList *)malloc(sizeof(LinkList));所以需要这次创建的节点保存起来,以便下次再用。
1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态增长 44 11. C语言中的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. C语言复杂表达式的执行步骤 66 16. C语言字符串函数大全 68 17. C语言宏定义技巧 89 18. C语言实现动态数组 100 19. C语言笔试-运算符和表达式 104 20. C语言编程准则之稳定篇 107 21. C语言编程常见问题分析 108 22. C语言编程易犯毛病集合 112 23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与return的差别 141 30. extern与static存储空间矛盾 145 31. PC-Lint与C\C++代码质量 147 32. spirntf函数使用大全 158 33. 二叉树的数据结构 167 34. 位运算应用口诀和实例 170 35. 内存对齐与ANSI C中struct内存布局 173 36. 冒泡和选择排序实现 180 37. 函数指针数组与返回数组指针的函数 186 38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针 224 46. 标准C中字符串分割的方法 228 47. 汉诺塔源码 231 48. 洗牌算法 234 49. 深入理解C语言指针的奥秘 236 50. 游戏外挂的编写原理 254 51. 程序实例分析-为什么会陷入死循环 258 52. 空指针究竟指向了内存的哪个地方 260 53. 算术表达式的计算 265 54. 结构体对齐的具体含义 269 55. 连连看AI算法 274 56. 连连看寻路算法的思路 283 57. 重新认识:指向函数的指针 288 58. 链表的源码 291 59. 高质量的子程序 295 60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的指针学习笔记 325 63. 程序员之路──关于代码风格 343 64. 指针、结构体、联合体的安全规范 346 65. C指针讲解 352 66. 关于指向指针的指针 368 67. C/C++ 误区一:void main() 373 68. C/C++ 误区二:fflush(stdin) 376 69. C/C++ 误区三:强制转换 malloc() 的返回值 380 70. C/C++ 误区四:char c = getchar(); 381 71. C/C++ 误区五:检查 new 的返回值 383 72. C 是 C++ 的子集吗? 384 73. C和C++的区别是什么? 387 74. 无条件循环 388 75. 产生随机数的方法 389 76. 顺序表及其操作 390 77. 单链表的实现及其操作 391 78. 双向链表 395 79. 程序员数据结构笔记 399 80. Hashtable和HashMap的区别 408 81. hash 表学习笔记 410 82. C程序设计常用算法源代码 412 83. C语言有头结点链表的经典实现 419 84. C语言惠通面试题 428 85. C语言常用宏定义 450

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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