单链表的简单操作...

来源:互联网 发布:人工智能的应用领域 编辑:程序博客网 时间:2024/06/06 16:37

已经好几天了。刚好今天有数据结构上机课,就顺便敲了下单链表的一些操作,合并之前写过,这里就没写了...


#include <stdio.h>#include <stdlib.h>#define ERROR 0#define OK 1#define false 0#define true 1typedef int Status;typedef int ElemType; /* ElemType类型根据实际情况而定,这里假设为int */typedef struct node{ElemType data;struct node *next;}node;typedef struct node *LinkList;  /* 定义LinkList *//* 初始化顺序线性表 */Status InitList(LinkList *L){    *L=(LinkList)malloc(sizeof(node)); /* 产生头结点,并使L指向此头结点 */    if(!(*L)) /* 存储分配失败 */            return ERROR;    (*L)->next=NULL; /* 指针域为空 */    return OK;}/* 操作: 用e返回L中第i个数据元素的值 */Status GetElem(LinkList L,int i,ElemType *e){int j;LinkList p;/* 声明一结点p */p = L->next;/* 让p指向链表L的第一个结点 */j = 1;/*  j为计数器 */while (p && j<i)  /* p不为空或者计数器j还没有等于i时,循环继续 */{p = p->next;  /* 让p指向下一个结点 */++j;}if ( !p || j>i )return ERROR;  /*  第i个元素不存在 */*e = p->data;   /*  取第i个元素的数据 */return OK;}/* 操作:在L中第i个位置之前插入新的数据元素e,L的长度加1 */Status ListInsert(LinkList *L,int i,ElemType e){int j;LinkList p,s;p = *L;j = 1;while (p && j < i)     /* 寻找第i个结点 */{p = p->next;++j;}if (!p || j > i)return ERROR;   /* 第i个元素不存在 */s = (LinkList)malloc(sizeof(node));  /*  生成新结点(C语言标准函数) */s->data = e;s->next = p->next;      /* 将p的后继结点赋值给s的后继  */p->next = s;          /* 将s赋值给p的后继 */return OK;}/* 操作:删除L的第i个数据元素,并用e返回其值,L的长度减1 */Status ListDelete(LinkList *L,int i,ElemType *e){int j;LinkList p,q;p = *L;j = 1;while (p->next && j < i)/* 遍历寻找第i个元素 */{        p = p->next;        ++j;}if (!(p->next) || j > i)    return ERROR;           /* 第i个元素不存在 */q = p->next;p->next = q->next;/* 将q的后继赋值给p的后继 */*e = q->data;               /* 将q结点中的数据给e */free(q);                    /* 让系统回收此结点,释放内存 */return OK;}/* 初始条件:顺序线性表L已存在 *//* 操作结果:依次对L的每个数据元素输出 */void ListTraverse(LinkList L){    LinkList p=L->next;    while(p)    {        printf("%d ",p->data);        p=p->next;    }    printf("\n");}/*  输入n个元素,建立带表头结点的单链线性表L(尾插法) */void CreateListTail(LinkList *L){LinkList p,r;int i,n;    printf("请输入元素个数n:\n");scanf("%d",&n);*L = (LinkList)malloc(sizeof(node)); /* L为整个线性表 */r=*L;                                /* r为指向尾部的结点 */printf("请依次输入n个数:\n");for (i=0; i<n; i++){p = (node *)malloc(sizeof(node)); /*  生成新结点 */scanf("%d",&(p->data));r->next=p;                        /* 将表尾终端结点的指针指向新结点 */r = p;                            /* 将当前的新结点定义为表尾终端结点 */}r->next = NULL;                       /* 表示当前链表结束 */}int main(){ LinkList L; Status i; ElemType e; int id; printf("初始化单链表\n");     i = InitList(&L); if(i) printf("初始化成功!\n\n"); else printf("初始化不成功!\n\n"); printf("创建单链表\n"); CreateListTail( &L ); printf("\n");     printf("查询链表的第i个元素值:\n");     printf("请输入要查询的位置id:\n");     scanf("%d",&id); if(GetElem(L,id,&e))        printf("查询成功,第id个元素值为:%d\n\n",e);     else        printf("查询失败!\n\n");     printf("插入操作:\n");     printf("请输入插入的元素e:\n");     scanf("%d",&e);     printf("请输入要插入的位置id;\n");     scanf("%d",&id);     if(ListInsert(&L,id,e))     {         printf("插入成功!\n");         printf("插入后的单链表是;\n");         ListTraverse(L);     }     else        printf("插入失败!\n");     printf("\n");     printf("删除操作:\n");     printf("请输入删除的位置id:\n");     scanf("%d",&id);     if(ListDelete(&L,id,&e))     {         printf("删除成功!\n");         printf("删除后的单链表是;\n");         ListTraverse(L);     }     else        printf("删除失败!\n");     printf("\n");      return 0;}


0 0
原创粉丝点击