动态链表怎么建立??

usr_src 2009-07-12 05:28:33
谁能帮我举个简单的动态链表的建立??多谢!!!
...全文
1079 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
stupid_ghost 2012-07-27
  • 打赏
  • 举报
回复
学习一下,恰好用的到
金刚葫芦娃 2010-03-26
  • 打赏
  • 举报
回复


mark
herman~~ 2009-07-13
  • 打赏
  • 举报
回复
好多数据结构的上面都有

usr_src 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Nio96 的回复:]
动态单向链表
单向链表的数据结构可以分为两部分:数据域和指针域,数据域存储数据,指针域指向下一个储存节点的地址。
  /*线性表的单链表存储结构*/
  typedef struct LNode{
  ElemType data;
  struct LNode *next;
  }LNode, *LinkList;
  /*带有头结点的单链表的基本操作(12个)*/
  void InitList(LinkList *L)
  { /* 操作结果:构造一个空的线性表L */
  *L=(LinkList)malloc(siz…
[/Quote]
太长了,太复杂了~~~我初学,看不懂!!~~~多谢~~!
usr_src 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jixingzhong 的回复:]
typedef struct node
{
 char name[20];
 struct node *link;
}stud;

  这样就定义了一个单链表的结构,其中char name[20]是一个用来存储姓名的字符型数组,指针*link是一个用来存储其直接后继的指针。

  定义好了链表的结构之后,只要在程序运行的时候爱数据域中存储适当的数据,如有后继结点,则把链域指向其直接后继,若没有,则置为NULL。

  下面就来看一个建立带表头(若未说明,以下所指链表均…
[/Quote]
我们习惯这样定义结构体:
struct node
{
char name【】;
struct node*next;
}stud;


呵呵!!
usr_src 2009-07-12
  • 打赏
  • 举报
回复
这个例子很经典@@@受益了!!多谢~~!!
Nio96 2009-07-12
  • 打赏
  • 举报
回复
动态单向链表
单向链表的数据结构可以分为两部分:数据域和指针域,数据域存储数据,指针域指向下一个储存节点的地址。
  /*线性表的单链表存储结构*/
  typedef struct LNode{
  ElemType data;
  struct LNode *next;
  }LNode, *LinkList;
  /*带有头结点的单链表的基本操作(12个)*/
  void InitList(LinkList *L)
  { /* 操作结果:构造一个空的线性表L */
  *L=(LinkList)malloc(sizeof(struct LNode)); /* 产生头结点,并使L指向此头结点 */
  if(!*L) /* 存储分配失败 */
  exit(OVERFLOW);
  (*L)->next=NULL; /* 指针域为空 */
  }
  void DestroyList(LinkList *L)
  { /* 初始条件:线性表L已存在。操作结果:销毁线性表L */
  LinkList q;
  while(*L)
  {
  q=(*L)->next;
  free(*L);
  *L=q;
  }
  }
  void ClearList(LinkList L) /* 不改变L */
  { /* 初始条件:线性表L已存在。操作结果:将L重置为空表 */
  LinkList p,q;
  p=L->next; /* p指向第一个结点 */
  while(p) /* 没到表尾 */
  {
  q=p->next;
  free(p);
  p=q;
  }
  L->next=NULL; /* 头结点指针域为空 */
  }
  Status ListEmpty(LinkList L)
  { /* 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
  if(L->next) /* 非空 */
  return FALSE;
  else
  return TRUE;
  }
  int ListLength(LinkList L)
  { /* 初始条件:线性表L已存在。操作结果:返回L中数据元素个数 */
  int i=0;
  LinkList p=L->next; /* p指向第一个结点 */
  while(p) /* 没到表尾 */
  {
  i++;
  p=p->next;
  }
  return i;
  }
  Status GetElem(LinkList L,int i,ElemType *e) /* 算法2.8 */
  { /* L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */
  int j=1; /* j为计数器 */
  LinkList p=L->next; /* p指向第一个结点 */
  while(p&&j < i) /* 顺指针向后查找,直到p指向第i个元素或p为空 */
  {
  p=p->next;
  j++;
  }
  if(!p||j>i) /* 第i个元素不存在 */
  return ERROR;
  *e=p->data; /* 取第i个元素 */
  return OK;
  }
  int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
  { /* 初始条件: 线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) */
  /* 操作结果: 返回L中第1个与e满足关系compare()的数据元素的位序。 */
  /* 若这样的数据元素不存在,则返回值为0 */
  int i=0;
  LinkList p=L->next;
  while(p)
  {
  i++;
  if(compare(p->data,e)) /* 找到这样的数据元素 */
  return i;
  p=p->next;
  }
  return 0;
  }
  Status PriorElem(LinkList L,ElemType cur_e,ElemType *pre_e)
  { /* 初始条件: 线性表L已存在 */
  /* 操作结果: 若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱, */
  /* 返回OK;否则操作失败,pre_e无定义,返回INFEASIBLE */
  LinkList q,p=L->next; /* p指向第一个结点 */
  while(p->next) /* p所指结点有后继 */
  {
  q=p->next; /* q为p的后继 */
  if(q->data==cur_e)
  {
  *pre_e=p->data;
  return OK;
  }
  p=q; /* p向后移 */
  }
  return INFEASIBLE;
  }
  Status NextElem(LinkList L,ElemType cur_e,ElemType *next_e)
  { /* 初始条件:线性表L已存在 */
  /* 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继, */
  /* 返回OK;否则操作失败,next_e无定义,返回INFEASIBLE */
  LinkList p=L->next; /* p指向第一个结点 */
  while(p->next) /* p所指结点有后继 */
  {
  if(p->data==cur_e)
  {
  *next_e=p->next->data;
  return OK;
  }
  p=p->next;
  }
  return INFEASIBLE;
  }
  Status ListInsert(LinkList L,int i,ElemType e) /* 算法2.9。不改变L */
  { /* 在带头结点的单链线性表L中第i个位置之前插入元素e */
  int j=0;
  LinkList p=L,s;
  while(p&&j < i-1) /* 寻找第i-1个结点 */
  {
  p=p->next;
  j++;
  }
  if(!p||j>i-1) /* i小于1或者大于表长 */
  return ERROR;
  s=(LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */
  s->data=e; /* 插入L中 */
  s->next=p->next;
  p->next=s;
  return OK;
  }
  Status ListDelete(LinkList L,int i,ElemType *e) /* 算法2.10。不改变L */
  { /* 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 */
  int j=0;
  LinkList p=L,q;
  while(p->next&&j< i-1) /* 寻找第i个结点,并令p指向其前岖 */
  {
  p=p->next;
  j++;
  }
  if(!p->next||j>i-1) /* 删除位置不合理 */
  return ERROR;
  q=p->next; /* 删除并释放结点 */
  p->next=q->next;
  *e=q->data;
  free(q);
  return OK;
  }
  void ListTraverse(LinkList L,void(*vi)(ElemType))
  /* vi的形参类型为ElemType,与bo2-1.c中相应函数的形参类型ElemType&不同 */
  { /* 初始条件:线性表L已存在。操作结果:依次对L的每个数据元素调用函数vi() */
  LinkList p=L->next;
  while(p)
  {
  vi(p->data);
  p=p->next;
  }
  printf("\n");
  }
jixingzhong 2009-07-12
  • 打赏
  • 举报
回复
typedef struct node
{
 char name[20];
 struct node *link;
}stud;

  这样就定义了一个单链表的结构,其中char name[20]是一个用来存储姓名的字符型数组,指针*link是一个用来存储其直接后继的指针。

  定义好了链表的结构之后,只要在程序运行的时候爱数据域中存储适当的数据,如有后继结点,则把链域指向其直接后继,若没有,则置为NULL。

  下面就来看一个建立带表头(若未说明,以下所指链表均带表头)的单链表的完整程序。

#include <stdio.h>
#include <malloc.h> /*包含动态内存分配函数的头文件*/
#define N 10 /*N为人数*/
typedef struct node
{
 char name[20];
 struct node *link;
}stud;
stud * creat(int n) /*建立单链表的函数,形参n为人数*/
{
 stud *p,*h,*s; /* *h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点*/
 int i; /*计数器*/
 if((h=(stud *)malloc(sizeof(stud)))==NULL) /*分配空间并检测*/
 {
  printf("不能分配内存空间!");
  exit(0);
 }
 h->name[0]='\0'; /*把表头结点的数据域置空*/
 h->link=NULL; /*把表头结点的链域置空*/
 p=h; /*p指向表头结点*/
 for(i=0;i<n;i++)
 {
  if((s= (stud *) malloc(sizeof(stud)))==NULL) /*分配新存储空间并检测*/
  {
   printf("不能分配内存空间!");
   exit(0);
  }
  p->link=s; /*把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了*/
  printf("请输入第%d个人的姓名",i+1);
  scanf("%s",s->name); /*在当前结点s的数据域中存储姓名*/
  s->link=NULL;
  p=s;
 }
 return(h);
}
main()
{
 int number; /*保存人数的变量*/
 stud *head; /*head是保存单链表的表头结点地址的指针*/
 number=N;
 head=creat(number); /*把所新建的单链表表头地址赋给head*/
}

  这样就写好了一个可以建立包含N个人姓名的单链表了。写动态内存分配的程序应注意,请尽量对分配是否成功进行检测。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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