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;
}
...全文
703 11 打赏 收藏 转发到动态 举报
写回复
用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;
}
Sunday 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);//打印创建的链表
}
Sunday 2010-04-18
  • 打赏
  • 举报
回复
p=q;//这句什么意思,最好整段全部解释下,数据结构一直不怎么懂
//p的下一个节点已经指向q,为什么要把q赋给p
;//保存临时创建的结点,以便下下一次的指针链接:p->next=q;否则,下次在链接节点时,上一次的节点就找不到了,因为你又重新申请了一个节点,q=(LinkList *)malloc(sizeof(LinkList));所以需要这次创建的节点保存起来,以便下次再用。

33,008

社区成员

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

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