赞
踩
编写一个程序linklist.cpp (或.c),实现单链表的各种基本运算和整体建表算法(假设顺序表的内容类型ElemType为char),并在此基础上设计一个程序exp3.cpp (或.c) 完成一下功能。
(1) 初始化一个单链表L。
(2) 采用尾插法依次将元素a、b、c、d、e插入单链L中。
(3) 输出单链表L。
(4) 输出单链表L的长度。
(5) 判断单链表L是否为空。
(6) 输出单链表L的第3个长度。
(7) 输出元素a的位置。
(8) 在单链表L的第4个元素位置上插入元素f。
(9) 输出单链表L。
(10) 删除单链表L的第3个元素。
(11) 输出单链表L。
(12) 销毁单链表L。
- #include<stdio.h>
- #include<malloc.h>
- #include<stdlib.h>
- #define OK 1
- #define OVERFLOW -2
- #define TRUE 1
- #define FALSE 0
- #define ERROR 0
- typedef char ElemType;
- typedef int Status;
- typedef struct LNode {
-
- ElemType data;
- struct LNode *next;
- }LNode,*LinkList;
-
- //初始化单链表
- Status InitList(LinkList &L) //初始化线性表
- {
- L = (LinkList )malloc(sizeof(LNode)); //创建头结点
- if (!L) {
- exit(OVERFLOW);
- }
- L->next = NULL;
- return OK;
- }
- //输出单链表
- void DispList(LinkList &L)
- {
- LinkList p;
- p = L->next;
- while (p != NULL)
- {
- printf("%c ", p->data);
- p = p->next;
- }
- printf("\n");
- }
-
- //输出单链表长度
- int lengthList(LinkList &L)
- {
- int n = 0;
- LinkList p = L->next;
- while (p != NULL)
- {
- n++;
- p = p->next;
- }
- return n;
- }
-
- //判断单链表是否为空
- int emptyList(LinkList &L)
- {
- if (L->next== NULL)
- return TRUE;
- else
- return FALSE;
- }
-
- //查值
- Status GetElem(LinkList &L, int i, ElemType &e)
- {
-
- int j=1;
- LinkList p = L->next; //struct LNode *p = L->next;
- while (p&&(j < i))
- {
- p = p->next;
- ++j;
- }
- if (!p || j > i)
- return ERROR;
- e = p->data;
- return OK;
- }
-
- //查元素位置
- int LocateElem(LinkList L, ElemType e)
- {
- int i = 1;
- LinkList p = L->next; //p指向开始节点,i置为1(即开始节点的序号为1)
- while (p != NULL && p->data != e) //查找data值为e的节点,其序号为i
- {
- p = p->next;
- i++;
- }
- if (p == NULL) //不存在元素值为e的节点,返回0
- return(0);
- else //存在元素值为e的节点,返回其逻辑序号i
- return(i);
- }
-
- //插入
- Status ListInsert(LinkList &L, int i, ElemType e)
- {
-
- int j = 0;
- LinkList p = L,s;
- while (p&&(j<i-1))
- {
- p = p->next;
- ++j;
- }
- if (p == NULL)
- return ERROR;
- else
- {
- s=(LinkList )malloc(sizeof(LNode));
- s->data = e;
- s->next = p->next;
- p->next = s;
- return OK;
- }
- }
-
- //删除链表中的元素
- Status ListDelete(LinkList &L, int i)
- {
- int j = 0;
- LinkList p = L,q;
- while ((p->next) && (j < i - 1))
- {
- p = p->next;
- ++j;
- }
- if (!(p->next) || (j > i - 1))
- return ERROR;
- q = p->next;
- p->next = q->next;
- delete q;
- return OK;
- }
-
-
- //销毁单链表
- Status DestroyList(LinkList &L)
- {
- LinkList q = L;
- while (q != NULL)
- {
- LinkList p = q;
- q = q->next;
- free(p);
- p = NULL;
- }
- return OK;
- }
- //exp3.cpp
- # include<stdio.h>
- int main()
- {
- int m;
- ElemType e;
- LinkList(L);
- printf("1:初始化链表L\n");
- InitList(L);
- printf("2:将a,b,c,d,e插入到单链表L里\n");
- ListInsert(L, 1, 'a');
- ListInsert(L, 2, 'b');
- ListInsert(L, 3, 'c');
- ListInsert(L, 4, 'd');
- ListInsert(L, 5, 'e');
- printf("3:输出单链表L:");
- DispList(L);
- m = lengthList(L);
- printf("4:输出单链表L的长度:%d\n",m);
- printf("5:单链表L为: %s \n", (emptyList(L) ? "空" : "非空"));
- GetElem(L, 3, e);
- printf("6:单链表L第3个元素:%c\n",e);
- printf("7:单链表L中a元素的位置:%d\n", LocateElem(L,'a'));
- printf("8:在单链表L第4个元素位置插入f\n");
- ListInsert(L, 4, 'f');
- printf("9:插入f后的单链表L为:");
- DispList(L);
- printf("10:删除单链表L的第3个元素\n");
- ListDelete(L, 3);
- printf("11:删除第3个元素后的单链表L为:");
- DispList(L);
- printf("12:销毁单链表L\n");
- DestroyList(L);
-
- while (1);
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。