头歌带头单链表的实现

// 单链表实现文件

#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"

 Status InitList(LinkList &L)
 { /* 操作结果:构造一个空的线性表L */
   L=(LinkList)malloc(sizeof(struct LNode)); /* 产生头结点,并使L指向此头结点 */
   if(!L) /* 存储分配失败 */
     exit(OVERFLOW);
   L->next=NULL; /* 指针域为空 */
   return OK;
 }

 Status DestroyList(LinkList &L)
 { /* 初始条件:线性表L已存在。操作结果:销毁线性表L */
   LinkList q;
   while(L)
   {
     q=L->next;
     free(L);
     L=q;
   }
   return OK;
 }

 Status 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; /* 头结点指针域为空 */
   return OK;
 }

 Status ListEmpty(LinkList L)
 { /* 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
   if(L->next) /* 非空 */
     return FALSE;
   else
     return TRUE;
 }

 int ListLength(LinkList L)
 { /* 初始条件:线性表L已存在。操作结果:返回L中数据元素个数 */
   //学号:          姓名: 
   // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    LinkList p = L;
	  int k = 0;
	  while (p->next)                                     //若p=NULL,则遍历完成
	  {
		  p = p->next;
		  k++;
	  }
	  return k;
    /********** End **********/
 }

 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 */
     //学号:          姓名: 
     // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    int i=0;
    LinkList p=L->next;
    while(p){
      i++;
      if(compare(p->data,e))
        return i;
      p=p->next;
    }
    return 0;

    /********** End **********/
 }

 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 */
    //学号:          姓名: 
       // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    if(i<1)
      return false;
    LNode *p;
    int j=0;
    p=L;
    while(p!=NULL&&j<i-1){
      p=p->next;
      j++;
    }
    if(p==NULL)
      return false;
    LNode *s=(LNode*)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return true;

   /********** End **********/
 }

 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;
 }

 Status ListTraverse(LinkList L,void(*vi)(ElemType))
 /* vi的形参类型为ElemType,与bo2-1.c中相应函数的形参类型ElemType&不同 */
 { /* 初始条件:线性表L已存在 */
   /* 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败 */
   LinkList p=L->next;
   while(p)
   {
     vi(p->data);
     p=p->next;
   }
   printf("\n");
   return OK;
 }

 Status comp(ElemType c1,ElemType c2)
 { /* 数据元素判定函数(相等为TRUE,否则为FALSE) */
   if(c1==c2)
     return TRUE;
   else
     return FALSE;
 }

 void visit(ElemType c) /* 与main2-1.c不同 */
 {
   printf("%d ",c);
 }

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是带头节点单链表实现 c 代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node *next; } Node; typedef struct List { Node *head; } List; // 初始化带头节点的单链表 void initList(List *list) { list->head = (Node *)malloc(sizeof(Node)); list->head->next = NULL; } // 在链表尾部插入元素 void insert(List *list, int data) { Node *p = list->head; while (p->next != NULL) { p = p->next; } Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; p->next = newNode; } // 删除链表中指定元素 void delete(List *list, int data) { Node *p = list->head; while (p->next != NULL) { if (p->next->data == data) { Node *temp = p->next; p->next = temp->next; free(temp); return; } p = p->next; } } // 查找链表中指定元素的位置 int find(List *list, int data) { Node *p = list->head->next; int index = 0; while (p != NULL) { if (p->data == data) { return index; } index++; p = p->next; } return -1; } // 输出链表元素 void printList(List *list) { Node *p = list->head->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { List list; initList(&list); insert(&list, 1); insert(&list, 2); insert(&list, 3); insert(&list, 4); insert(&list, 5); printf("原始链表:"); printList(&list); delete(&list, 3); printf("删除元素 3 后的链表:"); printList(&list); printf("元素 4 在链表中的位置是:%d\n", find(&list, 4)); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只微

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值