带头结点的链表

#include<stdio.h>

#include<stdlib.h>

#define N 9

typedef struct node{

int  data;

struct node * next;

}ElemSN;

ElemSN  * Createlink(int a[],int n){

int i;

ElemSN * h, * p;

h=p=(ElemSN *)malloc(sizeof(ElemSN));

h->next=NULL;

for( i=0;i<N;i++){

p=p->next=(ElemSN *)malloc(sizeof(ElemSN));

p->data =a[i];

p->next=NULL;

}

return h;

}

void printlink(ElemSN * h){

ElemSN * p;

for(p=h;p->next;p=p->next)

printf("%2d\n",p->next->data);

}

int main(void){

int a[N]={1,2,3,4,5,6,7,8,9};

ElemSN * head;

head=Createlink(a,9);

printlink(head);

}

原文地址:http://blog.51cto.com/13645380/2154801

时间: 2024-12-25 22:33:27

带头结点的链表的相关文章

带头结点的链表和声明指向第一个元素的头指针

严蔚敏老师的数据结构分析一书中,都是采用带头结点的链表,可能读者一时间还不知道是什么意思:首先看一段伪代码: L是链表的头结点 L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; 链表的头指针也是一个结点,尽管这是一个空的结点,只是说明这个结点并没有携带任何有效的参数. 而我的实现当中确实没有分配一个结点,而只是一个指针,指向第一个元素. typedef struct SNode{     int nData;     SNode* pNextNod

不带头结点的链表的增删改查

这两天都在学习数据结构中的链表操作,觉得有很多东西想跟大家分享,通常写链表一般会创建一个带头结点的链表,带头结点链表非常容易的进行链表的遍历,而不带头结点的链表,一马虎就会指错,所以在这里跟大家分享下我进行没有头结点的创建时的心得! 1.创建无头结点链表(头插) 2.删除中间节点(不是第一个也不是最后一个) 1 #include<stdio.h> 2 #include<malloc.h> 3 typedef char ElemType; 4 typedef struct node

链表习题(3)-将带头结点的链表进行逆置

1 /*将带头结点的链表进行逆置*/ 2 /* 3 算法思想:设逆置链表尾空,将原链表中的结点依次删除后,按头插法插入逆置链表中,直至 4 原链表为空 5 */ 6 void Reverse(LinkList& L) 7 { 8 LNode *p, *q; 9 p = L->next; 10 L->next = NULL; 11 while (p) 12 { 13 q = p; 14 p = p->next; 15 /*头插法*/ 16 q->next = L->ne

数据结构笔记5带头结点单链表

/* 本次操作是对带头节点单链表的操作  包括删除  插入 判空 建立  包括删除插入函数  显示函数 目的是为了对单链表做一个基本操作的总结----1*/ #include<stdio.h>#include<malloc.h>#include<conio.h>#define OK 1#define ERROR -1#define OVERFLOW -2#define ENDFLAG 0typedef struct LNode{ int data; struct LNo

数据结构-1 带头结点的链表合并

List Merge( List L1, List L2 ){ struct Node *h,*p,*l1,*l2; h = (struct Node*)malloc(sizeof(struct Node)); h->Next = NULL; p = h; l1 = L1->Next; l2 = L2->Next; while(l1!=NULL && l2!=NULL){ if(l1->Data > l2->Data){ p->Next = l2;

C语言实现单链表的节点插入(带头结点)

我在之前一篇博客<C语言实现单链表(不带头结点)节点的插入>中具体实现了怎样在一个不带头结点的单链表中进行节点的插入.可是在实际应用中,带头结点的链表更为经常使用.更为方便.今天我们就要来使用带头结点的单链表进行节点的插入.演示样例代码上传至 https://github.com/chenyufeng1991/InsertList_HeadNode  . 核心代码例如以下: Node *InsertNode(Node *pNode,int pos,int x){ int i = 0; Node

C语言实现单链表(带头结点)的基本操作

我在之前一篇博客<C语言实现单链表(不带头结点)的基本操作>中具体实现了不带头结点的单链表的11种操作:如计算链表长度.初始化.创建链表.清空链表等等.但是在实际使用中,带头结点的单链表往往比不带头结点的单链表用的更多,使用也更为方便.因为不用单独考虑第一个节点的情况了,第一个节点和其他后续节点的处理全都一样了,简化操作.这篇博客将会来实现带头结点的单链表的11种操作.代码上传至: https://github.com/chenyufeng1991/LinkedList_HeadNode  .

在不同的数据结构中链表是否带头结点的分析

一.链表 学习数据结构链表的时候,就有区分 带头结点的链表和不带头结点的链表 当时写完带头结点的链表的基本操作算法后,又写了一遍不带头结点的链表的基本操作. 发现是否带头结点的区别主要体现在2个操作的算法上:插入和删除 不带头结点的链表的插入和删除操作因为涉及对第一个结点插入删除,会改变头指针的值,需要对第一个结点单独分析,链表头指针形参上也因此上加入引用或者指针. 所以相对带头结点的链表操作上不带头结点的链表会更加麻烦. 插入算法上的差异: 1 //带头结点的链表 2 int insert(L

链表不带头结点的实现

首先要强调的是,ADT没有变化,只是实现上的变化. 不带头结点的实现比带头结点的实现稍微复杂一些,尤其体现在插入(第58-60行)和删除(第88-91行),要单独处理表头改变的情况.而带头结点的链表表头不会变化,总是指向头结点. 其他操作的不同之处同学们自行比较. 下面的问题会帮助你的理解: 第83行 while(p && j < i - 1) {   而教材上带头结点的实现为while(p->next && j < i - 1) { 为什么会有这种区别?