如何创建单链表?

作者&投稿:芒施 (若有异议请与网页底部的电邮联系)
如何创建单链表~

这我原来写的,有单链表的建立、插入、删除、查找等,希望对你有帮助
typedef struct node{
int data;
struct node *next;
}node;

node *create()
{
node *head,*p,*q;
int i=0;
int x;

head=(node *)malloc(sizeof(node));
while(1)
{
printf("please input the node:");
scanf("%d",&x);
if(x==0) {break;}
p=(node *)malloc(sizeof(node));
p->data=x;
if(++i==1)
{
head->next=p;
}
else
{
q->next=p;
}
q=p;
}
q->next=NULL;
return head;
}

void print(node *head)
{
node *p;
int index=0;
if(head->next==NULL)
{
printf("Link is empty!
");
exit(0);
}
p=head->next;
while(p!=NULL)
{
printf("the %d node is %d
",++index,p->data);
p=p->next;
}
}

int length(node *head)
{
int len=0;
node *p;
p=head->next;
while(p)
{
len++;
p=p->next;
}
return len;
}

node *search(node *head,int pos)
{
node *p;
int len=length(head);

p=head->next;
if(pos<0)
{
printf("incorrect position!
");
return NULL;
}
else if(pos>len)
{
printf("incorrect position!
");
return NULL;
}
else if(pos==0)
{
return head;
}

if(p==NULL)
{
printf("the link is empty!
");
return NULL;
}
while (--pos)
{
p=p->next;
}
return p;
}

node *delete(node *head,int pos)
{
node *p,*q;
int len=length(head);

p=head->next;
if(pos<0)
{
printf("incorrect position!
");
return NULL;
}
else if(pos>len)
{
printf("incorrect position!
");
return NULL;
}
if(p==NULL)
{
printf("link empty!
");
return NULL;
}
p=search(head,pos-1);
if(p!=NULL&&p->next!=NULL)
{
q=p->next;
p->next=q->next;
free(q);
}
return head;
}

node *insert(node *head,int pos,int x)
{
node *p,*q=NULL;
q=(node *)malloc(sizeof(node));
q->data=x;
if(pos==0)
{
head->next=q;
return head;
}
p=search(head,pos);
if(p!=NULL)
{
q->next=p->next;
p->next=q;
}
return head;
}

C语言创建单链表如下:
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include "iostream.h"
typedef struct node
{
int data;
node * next;
}node , * List;
void create(int n)
{
int c;
List s,L;
L=(List)malloc(sizeof(node));
L->next=NULL;
printf("请输入第1个数据:");
scanf("%d",&c);
L->data=c;
for(int i=2;i<=n;i++)
{
s=(List)malloc(sizeof(node));
printf("请输入第%d个数据:",i);
scanf("%d",&c);
s->data=c;
s->next=L;
L->next =s;
}
printf("链表创建成功!");
}
void main()
{
int n;
printf("请你输入链表的个数:");
scanf("%d",&n);
create(n);
}

单链表创建方法:
单链表的建立有头插法、尾插法两种方法。
1. 头插法
单链表是用户不断申请 存储单元和改变链接关系而得到的一种特殊 数据结构,将链表的左边称为链头,右边称为链尾。头插法建单链表是将链表右端看成固定的,链表不断向左延伸而得到的。头插法最先得到的是尾结点。
由于链表的长度是随机的,故用一个while循环来控制链表中结点个数。假设每个结点的值都大于O,则循环条件为输入的值大于o。申请 存储空间可使用malloc()函数实现,需设立一申请单元 指针,但malloc()函数得到的指针并不是指向 结构体的指针,需使用 强制类型转换,将其转换成结构体型指针。刚开始时,链表还没建立,是一空链表,head 指针为NULL。
链表建立的过程是申请空间、得到数据、建立链接的循环处理过程。
2. 尾插法
若将链表的左端固定,链表不断向右延伸,这种建立链表的方法称为尾插法。尾插法建立链表时,头 指针固定不动,故必须设立一个搜索指针,向链表右边延伸,则整个算法中应设立三个链表指针,即头指针head、搜索指针p2、申请单元指针pl。尾插法最先得到的是 头结点。

建立单链表的常用方法有两种:头插法建表、尾插法建表



1、链接存储方法
链接方式存储的线性表简称为链表(Linked List)。
链表的具体存储表示为:
① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)
② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link))
注意:
链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。

2、链表的结点结构
┌──┬──┐
|data | next│
└──┴──┘
data域--存放结点值的数据域
next域--存放结点的直接后继的地址(位置)的指针域(链域)
注意:
①链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的。
②每个结点只有一个链域的链表称为单链表(Single Linked List)。
【例】线性表(bat,cat,eat,fat,hat,jat,lat,mat)的单链表示如示意图

3、头指针head和终端结点指针域的表示
单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点。
注意:
链表由头指针唯一确定,单链表可以用头指针的名字来命名。
【例】头指针名是head的链表可称为表head。
终端结点无后继,故终端结点的指针域为空,即NULL。

4、单链表的一般图示法
由于我们常常只注重结点间的逻辑顺序,不关心每个结点的实际位置,可以用箭头来表示链域中的指针,线性表(bat,cat,fat,hat,jat,lat,mat)的单链表就可以表示为下图形式。

5、单链表类型描述
typedef char DataType; /* 假设结点的数据域类型为字符 */
typedef struct node { /* 结点类型定义 */
DataType data; /* 结点的数据域 */
struct node *next; /* 结点的指针域 */
} ListNode;
typedef ListNode *LinkList;
ListNode *p;
LinkList head;
注意:
①LinkList和ListNode *是不同名字的同一个指针类型(命名的不同是为了概念上更明确)
②LinkList类型的指针变量head表示它是单链表的头指针
③ListNode *类型的指针变量p表示它是指向某一结点的指针

6、指针变量和结点变量


┌────┬────────────┬─────────────┐ 
│    │    指针变量    │     结点变量    │
├────┼────────────┼─────────────┤
│ 定义 │在变量说明部分显式定义 │在程序执行时,通过标准 │
│ │ │函数malloc生成 │
├────┼────────────┼─────────────┤
│ 取值 │ 非空时,存放某类型结点 │实际存放结点各域内容 │
│ │ 的地址 | │
├────┼────────────┼─────────────┤
│操作方式│ 通过指针变量名访问 │ 通过指针生成、访问和释放 │
└────┴────────────┴─────────────┘

①生成结点变量的标准函数
p = malloc( sizeof(ListNode) );
/* 函数malloc分配一个类型为ListNode的结点变量的空间,并将其首地址放入指针变量p中 */
②释放结点变量空间的标准函数
free(p); /* 释放p所指的结点变量空间 */
③结点分量的访问
利用结点变量的名字*p访问结点分量
方法一:(*p).data和(*p).next
方法二:p-﹥data和p-﹥next
④指针变量p和结点变量*p的关系
指针变量p的值——结点地址
结点变量*p的值——结点内容
(*p).data的值——p指针所指结点的data域的值
(*p).next的值——*p后继结点的地址
*((*p).next)——*p后继结点
注意:
① 若指针变量p的值为空(NULL),则它不指向任何结点。此时,若通过*p来访问结点就意味着访问一个不存在的变量,从而引起程序的错误。
② 有关指针类型的意义和说明方式的详细解释



1、创建一个带头结点的单链表(头指针为head),且遍历此链表(输出链表中...
答:include <iostream>using namespace std;struct node { int value;struct node * next;};typedef struct node Node;typedef struct node *ptrList,*List;void create(Node *&T);void PrintNode(ptrList V);//建立链表 void create(Node *&T){ Node *p,*tmp; //插入的指针 int n;if(T=...

关于单链表中指针的问题。
答:其中data部分存储数据,可以不去管它;next指针就是为了将链表中的node连接起来而设置的指针,它位于前一个node中,并指向后一个node,这样,一个接一个的node就能够连接起来了,组成单链表。图中是创建一个单链表的函数,创建单链表的步骤如下:malloc一个node,作为链表的第一个节点同时作为单链表的...

请问如何使用calloc创建50个节点的单链表?要c语言的代码谢谢!
答:include <stdio.h>#include <malloc.h>typedef struct stt{ int id; struct stt *next;}STT;#define stNum 50//创建50个节点的链表,可修改int main(){ int i,idCnt=1; STT *sttp=(STT *)calloc(stNum,sizeof(STT)); STT sh,*sttTail=NULL,*sttHead=&sh; sttHead...

输入一组整数,建立带头结点的单链表,并实现线性表的求长度、插入和删除...
答:自己写的,不过是用的c++,希望能帮到你。include <iostream> using namespace std;struct Node { int Value;Node *next;};//创建链表 Node *CrtNode(int n){ Node *head; //声明头指针head Node *p,*s;int x;head=new Node; //创建头结点由head指向(空的头结点)s=head;cout<<"请...

采用表尾插入元素创建一个单链表。
答:第一个问题:include "stdio.h"typedef struct lnode { int data;struct lnode *next;}lnode,*link;lnode *creat()用尾插入元素创建一个单链表函数;{ link La,p,q;int i,n;La=(link)malloc(sizeof(lnode));创建头结点 La->next=NULL;q=La;printf("input the number of element n:\...

利用数觉结构和C语言。实现单链表的创建 插入 删除 打印 查询
答:include <stdio.h> include <malloc.h> define N 8 typedef struct node {int data;struct node *next;}node;node * createsl(){ node *p,*s,*h;int j=1,x;p=s=h=(node*)malloc(sizeof(node));h->next=NULL;printf("please input the data to create the list,end with -1 or ...

创建单链表的C程序
答:p);return h;} <<<最后,十分感谢你,让我琢磨出了双指针建单链表的方法。我第一次给你的方法要用三指针 参考资料:http://zhidao.baidu.com/question/312877233.html

...实现单链表的创建、插入、删除、打印和查询功能。
答:C++有,c的没有,不过可以自己改回去。include<iostream> using namespace std;int len=0;struct list//结构的声明 { int data;list *next;};list *head;list *create()//建立链表,这是第一步;{ list *p,*q;head=NULL;int temp;cout<<"Now create the list,Input the data,end by -1...

c数据结构 实现单链表的创建、插入、删除、打印和查询
答:cout<<"请输入一串单字符数据,以*结束!"<<endl;char ch;link *HEAD;link *R,*P,*L;HEAD=(link *)malloc(sizeof(link));HEAD->next=NULL;R=HEAD;getchar();ch=getchar();while(ch!='*'){ P=(link *)malloc(sizeof(link));P->data=ch;P->next=NULL;R->next=P;R=R->next...

【数据结构】单链表的创建与输出
答:您好,我已经帮你改成功了,我也是刚看到你的问题的 include <stdio.h>#include <malloc.h>#include <stdlib.h> //缺省这个头文件,exit(0)要用到 typedef int ElemType;typedef struct LNode{ElemType data;struct LNode *next;} LNode;int n;struct LNode *creatlink(){struct LNode *he...