1. c语言带头节点与不带头节点有什么区别
带头节点,对第一个节点及其后的节点都可以一样看待,任何操作都可以用相同的方法。
不带头节点,对第一个节点的操作就要区别对待,比如删除了第一个节点,第二个就作为第一个,头指针就要修改指向第二个节点。带了头结点,头指针一直指向头结点。
2. C语言中结点是什么
1、在数据结构的图形表示中,对于数据集合中的每一个数据元素用中间标有元素值的方框表示,一般称之为数据结点,简称结
点。在C语言中,链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据;二为下一个结点的地址,即指针域和数据域。数据结构中的每一个数据结点对应于一个储存单元,这种储存单元称为储存结点,也可简称结点。
2、举例说明如下:
1)对于线性表存储结构:
1, 2, 3, 4, 5, ......, k, k+1, .......
则结点k+1的直接前驱结点为结点k
2)对于链表存储结构
// 结点的定义
struct node
{
int data; // 数据域
struct node *next; // 指针域
};
struct node *Head; // Head表示链表的头结点,则Head->next为头结点Head的后继结点;Head为Head->next的前驱节点
3. C语言创建带头结点的链表
#include<stdio.h>
#include<stdlib.h>
#defineN8
typedefstructlist{
intdata;
structlist*next;
}SLIST;
SLIST*deletelist(SLIST*p,int*pvalue){
SLIST*q,*t;
q=p;
while(q->next){
if(q->next->data==*pvalue){
t=q->next;
q->next=t->next;
free(t);
break;
}
q=q->next;
}
returnp;
}
SLIST*creatlist(int*a){
SLIST*h,*p,*q;
inti;
h=p=(SLIST*)malloc(sizeof(SLIST));
for(i=0;i<N;i++){
q=(SLIST*)malloc(sizeof(SLIST));
q->data=a[i];
p->next=q;
p=q;
}
p->next=0;
returnh;
}
voidoutlist(SLIST*h){
/*这里输出链表中各个数据*/
SLIST*p=h->next;
while(p){
printf("%d",p->data);
p=p->next;
}
printf(" ");
}
intmain(void){
SLIST*head;
intnvalue,i;
inta[N];
printf("输入%d个整数: ");
for(i=0;i<N;i++){
scanf("%d",&a[i]);
}
head=creatlist(a);
outlist(head);
printf("要删除的数据:");
scanf("%d",&nvalue);//删除的结点数据
head=deletelist(head,&nvalue);
outlist(head);
return0;
}
4. 用c语言尾插法建立带头结点的单链表
EOF!=(scanf("%d",&x)是什么意思?把scanf("%d",&x)写在while语句的上面为什么不行?
这里是指输入成功的话,执行下面的大括号里面语句。
pre->next是指当前结点的前一个结点,这里用于交换位置的。你可以画个图来查看他们之间的联系,就会很清楚了
5. C语言 带头结点的单链表的各种操作
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
// 定义链表中的节点
typedef struct node
{
int member;
struct node *pNext;
}Node,*pNode;
pNode CreateList(int *); // 创建链表函数
void TraverseList(pNode ); // 遍历链表函数
void Insert_Node(pNode,int);
int Del_Node(pNode);
int main()
{
int a[10]={2,1,0,3,6,4,8,2,7,9};
int s[10]={2,5,4,6,3,1,8,7,9,0};
pNode pHead = NULL;
int data;
int num;
int choose;
int return_val;
pHead = CreateList(a);
Insert_Node(pHead,10);
TraverseList(pHead);
pHead = CreateList(s);
printf("删除数据%d ",Del_Node(pHead));
TraverseList(pHead);
return 0;
}
pNode CreateList(int *a)
{
int i; // 用于下面循环
int len=10; // 用来存放有效节点的字数
int val; // 用于临时存放用户输入的数据
pNode pHead = (pNode)malloc(sizeof(Node)); // 分配一个不存放有效数据的头结点
pNode pTail = pHead; // 链表的最后一个节点
pTail->pNext = NULL; // 最后一个节点的指针置为空
for(i = 0; i < len; i++)
{
pNode pNew = (pNode)malloc(sizeof(Node)); // 为节点分配空间
pNew->member = a[i];; //将用户输入的数据赋给节点的成员
pTail->pNext = pNew; //将最后一个节点的指针指向下一个新的节点
pNew->pNext = NULL; //将新节点中的指针置为空
pTail = pNew; //将新节点赋给最后的一个节点
}
return pHead; //返回头节点
}
// 遍历链表函数
void TraverseList(pNode pHead)
{
pNode p = pHead->pNext; //将头节点的指针给予临时节点p
while(NULL != p) //节点p不为空,循环
{
printf("%d ",p->member);
p = p->pNext;
}
printf(" ");
return ;
}
void Insert_Node(pNode pHead,int data)
{
int i = 0;
pNode _node = pHead,nex,pNew;
while (1)
{
_node = _node->pNext;
++i;
if(i==5) break;
}
pNew = (pNode)malloc(sizeof(Node));
nex=_node->pNext;
pNew->member = data; // 把输入的数据赋给要插入的节点
_node->pNext = pNew; // 把要插入的节点的地址,给上个节点的指针域
pNew->pNext = nex;
}
// 删除链表节点函数
int Del_Node(pNode pHead)
{
int i = 0;
int data;
pNode _node = pHead;
pNode pSwap;
while(1)
{
_node = _node->pNext;
++i;
if(i==4) break;
}
pSwap = _node->pNext;
data = pSwap->member;
_node->pNext = _node->pNext->pNext;
free(pSwap);
return data;
}
6. 求数据结构(C语言)带头结点的单链表 节点的插入
我给你说下大概思路:
1、在p之前插入结点,首先要找到p前一个结点的位置,假设用pos指向p前一个结点的位置,然后申请结点newNode,让它的数据域为e,然后让newNode->next=pos->next,pos->next=newNode。
2、在p之后插入结点,同样申请结点,赋值为e,然后让NewNode->next=p->next,p->next=NewNode。
7. C语言建立带头结点的单链表
单链表的生成有2种方式:头插法和尾插法。
1、头插法
/*********************************************************************
*函数名称:linklist*CreateLinklistHead()
*函数功能:利用头插法创建链表
*参数:无
*返回值:创建完链表后的链表头结点
*说明:无
*********************************************************************/
externlinklist*CreateLinklistHead()
{
intx,i,nodeNum;
linklist*head,*temp;//头结点与临时结点
head=(linklist*)malloc(sizeof(linklist));//生成表头结点
head->next=NULL;//给表头结点的指针域赋值
printf("请输入链表中结点的个数:");
scanf("%d",&nodeNum);
for(i=1;i<=nodeNum;i++)
{
printf("请输入第%d个结点的数据:",i);
scanf("%d",&x);
temp=(linklist*)malloc(sizeof(linklist));//生成新的结点
temp->data=x;//对新结点的数据域赋值
//将新结点插到头结点之后
temp->next=head->next;
head->next=temp;
}
returnhead;//返回新建链表的头结点
}
2、尾插法
/*********************************************************************
*函数名称:linklist*CreateLinklistRear()
*函数功能:利用尾插法创建链表
*参数:无
*返回值:创建完链表后的链表头结点
*说明:无
*********************************************************************/
externlinklist*CreateLinklistRear()
{
intx,i,nodeNum;
linklist*head,*rear,*temp;//定义头结点、尾结点和临时结点
head=(linklist*)malloc(sizeof(linklist));//生成表头结点,表头结点不存放数据
head->next=NULL;//将表头结点的指针域赋值为NULL
rear=head;//将表头结点赋值给表尾结点
printf("请输入链表中结点的个数:");
scanf("%d",&nodeNum);
for(i=1;i<=nodeNum;i++)
{
printf("请输入第%d个结点的数据:",i);
scanf("%d",&x);
temp=(linklist*)malloc(sizeof(linklist));//生成新的结点
temp->data=x;//新增结点的数据域
temp->next=NULL;//新增结点的指针域(由于是尾插法,所以插入的结点都在尾部,即指针域为NULL)
rear->next=temp;//使前一个结点指向新增结点(head->next=temp)
rear=temp;//将新增结点赋值给尾结点(尾插法,插入的结点在尾部)(rear=head->next)
}
//rear->next=NULL;//将尾结点的指针域赋值为空(为了方便检验链表是否为空链表)
returnhead;//返回头结点
}
8. C语言 创建带头结点的链表
单链表的生成有2种方式:头插法和尾插法。
1、头插法
/*********************************************************************
* 函数名称:linklist *CreateLinklistHead()
* 函数功能:利用头插法创建链表
* 参 数:无
* 返 回 值:创建完链表后的链表头结点
* 说 明:无
*********************************************************************/
extern linklist *CreateLinklistHead()
{
int x, i, nodeNum;
linklist *head, *temp; // 头结点与临时结点
head = (linklist *)malloc(sizeof(linklist)); // 生成表头结点
head->next = NULL; // 给表头结点的指针域赋值
printf("请输入链表中结点的个数:");
scanf("%d", &nodeNum);
for(i=1; i<=nodeNum; i++)
{
printf("请输入第 %d 个结点的数据:", i);
scanf("%d", &x);
temp = (linklist *)malloc(sizeof(linklist)); // 生成新的结点
temp->data = x; // 对新结点的数据域赋值
// 将新结点插到头结点之后
temp->next = head->next;
head->next = temp;
}
return head; // 返回新建链表的头结点
}2、尾插法
/*********************************************************************
* 函数名称:linklist *CreateLinklistRear()
* 函数功能:利用尾插法创建链表
* 参 数:无
* 返 回 值:创建完链表后的链表头结点
* 说 明:无
*********************************************************************/
extern linklist *CreateLinklistRear()
{
int x, i, nodeNum;
linklist *head, *rear, *temp; // 定义头结点、尾结点和临时结点
head = (linklist *)malloc(sizeof(linklist)); // 生成表头结点,表头结点不存放数据
head->next = NULL; // 将表头结点的指针域赋值为NULL
rear = head; // 将表头结点赋值给表尾结点
printf("请输入链表中结点的个数:");
scanf("%d", &nodeNum);
for(i=1; i<=nodeNum; i++)
{
printf("请输入第 %d 个结点的数据:", i);
scanf("%d", &x);
temp = (linklist *)malloc(sizeof(linklist)); // 生成新的结点
temp->data = x; // 新增结点的数据域
temp->next = NULL; // 新增结点的指针域(由于是尾插法,所以插入的结点都在尾部,即指针域为NULL)
rear->next = temp; // 使前一个结点指向新增结点(head->next=temp)
rear = temp; // 将新增结点赋值给尾结点(尾插法,插入的结点在尾部)(rear=head->next)
}
//rear->next = NULL; // 将尾结点的指针域赋值为空(为了方便检验链表是否为空链表)
return head; // 返回头结点
}
9. 用c语言写带头结点链表分块的算法设计(大于5的值放入链表B,小于5的值放入链表C)
typedefine struct {
int value;
LinkList *next;
}LinkList;
void SblitList(LinkList *A, LinkList **B, LinkList **C)
{
while(A)
{
if(A->value > 5)
{
push(B, A->value);
}
else
push(C, A->value);
A = A->next;
}
}
10. 数据结构:用C语言:创建一个带结点的空链表,并输出。
#include<cstdio>
#include<cstdlib>
typedefstructpoi
{
charnum[10];
charname[20];
intage;
structpoi*next;
}pointer;
pointer*head,*tail;
pointer*newnode()
{
pointer*u=(pointer*)malloc(sizeof(pointer));//分配一个动态地址。这个函数要记下里。同时要开cstdlib头文件
u->next=NULL;
}
intmain()
{
head=newnode();//创建一个新的指针。
tail=head;
for(inti=1;i<=5;i++)
{
tail->next=newnode();
tail=tail->next;
//你可以输入数据然后存入指针中。比如scanf("%d",&tail->age);然后给tail->num什么的赋值。
}
pointer*u=head->next;
while(u!=NULL)
{
//输出什么东西。。。比如printf("%d ",u->age);
u=u->next;
}
return0;
}