单链表创建的头插法,尾插法,插入、删除、获取元素,删除整表

    科技2022-08-17  168

    /* 程序功能:链表的基本操作 1、初始化链表 2、头插法创建链表 3、尾插法创建链表 4、删除、添加结点 5、删除链表 6、获取链表中第i个位置的值 7、单链表整表删除 注意:在进行链表的定义时链表是以结点为构成单位,要构建结点再一个一个的对结点进行操作,而不是直接向顺序存储结构直接定义一个顺序表 */ #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROE 0 #define TRUE 1 #define FALSE 0 typedef int ElemType; typedef int Status; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; //初始化链表 Status InitList(LNode *L); //打印链表 Status PrintList(LinkList L); //创建链表 Status CreateList(LNode *head); Status CreateListTail(LNode *head); Status GetElem(LinkList L,int i,ElemType *e); LNode *LocateElem(LinkList L,ElemType e); Status InsertList(LinkList *L,int i,ElemType e); Status DeleteList(LinkList *L,int i,ElemType *e); Status ClearList(LinkList *L); //初始化单链表 Status InitList(LinkList L) { L = (LNode *)malloc(sizeof(LinkList)); if(L == NULL) { printf("申请内存空间失败"); } L->next = NULL; return OK; } //头插法建立单链表 //1.为头结点L申请空间 //2.创建指向新结点的指针p //3.输入结点的值,为结点申请存储空间 //4.数据赋值给p->data //5.进行插入新结点的操作 //6.即让p的next指针域指向头结点的后继;头结点的next指针域指向p Status CreateList(LNode *head) { int x; printf("请输入数值:"); scanf("%d",&x); while(x != 9999) { LNode *node = (LNode *) malloc(sizeof(LNode)); node->data = x; node->next = head->next; head->next = node; scanf("%d",&x); } return OK; } //尾插法建立单链表 //思路:设置尾指针,每次在尾指针后面插入新的结点, //尾指针的next指针域指向新的结点 //当前新节点定义为尾结点 //尾指针置空 Status CreateListTail(LNode *head) { int x; LNode *t = head; printf("请输入尾插法插入的数值:"); scanf("%d",&x); while(x != 9999) { LNode *node = (LNode *) malloc(sizeof(LNode)); node->data = x; t->next = node; t = node; scanf("%d",&x); } t->next = NULL; return OK; } //利用位置获取元素位置 //所需条件:链表整表,位置i,以及用来接收i的指针e Status GetElem(LinkList L,int i,ElemType *e) { int j = 1; //计数器 LNode *p = L->next; while(p != NULL && j<i) { p = p->next; j++; } if(!p || j > i) { return ERROE; } *e = p->data; return OK; } //查找链表中是否存在值为e的元素,若存在返回其序列号,若不存在返回error LNode *LocateElem(LinkList L,ElemType e) { LNode *p = L->next; while(p != NULL && p->data != e) { p = p->next; } return p; } //插入结点,在第i个位置之前插入结点 //步骤:1.先查找到第i个结点 // (1)指针p指向链表的第一个位置,设置计数器j(初始为1) // (2)j<i时遍历链表,p指针不断向后移,j++ // (3)p == NULL ,i结点不存在,否则查找成功 // 2.插入该结点 // 如果查找成功,生成一个空结点,把数据赋给该结点的data域,然后移动指针 //要使该结点插入,三个要素,链表L,插入的位置i,以及插入得的数据 //切记插入删除操作都对链表进行了了改变需要使用*L Status InsertList(LinkList *L,int i,ElemType e) { int j = 1; LNode * p = *L; while(p != NULL && j < i) { p = p->next; j++; } if(!p || j > i) return ERROE; LNode *s = (LNode *)malloc(sizeof(LNode)); s->data = e; s->next = p->next; p->next = s; return OK; } //删除结点 //步骤:1.查找删除的结点的位置 // (1)进行查找操作(同插入) // (2)若要删除的结点存在,进行删除操作,移动指针 Status DeleteList(LinkList *L,int i,ElemType *e) { int j=1; LNode *p = *L; while(p ->next && j<i) { p = p->next; j++; } if(!(p->next) || j>i) { return ERROE; } LNode *q = p->next; *e = q->data; p->next = q->next; free(q); return OK; } //单链表整表删除 //步骤:声明两个指针p q // p指向第一个结点,q指向下一个结点 // 释放p,把q的结点赋值给p Status ClearList(LinkList *L) { LNode *p,*q; p = (*L)->next; while(p) { q = p->next; free(p); p = q; } (*L)->next = NULL; return OK;-- } //打印整个链表 Status PrintList(LinkList L) { LNode *nextnode = L->next; while(NULL != nextnode) { printf("%d ",nextnode->data); nextnode = nextnode->next; } printf("\n"); return OK; } int main() { int e; LNode *head = (LNode *) malloc(sizeof(LNode)); head->next = NULL; //InitList(head); //CreateList(head); //PrintList(head); CreateListTail(head); PrintList(head); //GetElem(head,3,&e); //printf("第3个位置的元素为:%d",e); //LocateElem(head,3); InsertList(&head,3,6); printf("插入元素后的链表为"); PrintList(head); DeleteList(&head,2,&e); printf("删除元素后的链表为"); PrintList(head); ClearList(&head); if(1 == ClearList(&head)) { printf("清空链表成功!!"); } }
    Processed: 0.014, SQL: 9