单链表应用举例(单链表A和单链表B的元素都是非递减排列,利用单链表的基本运算,将它们合并成一个单链表C,要求C也是非递减序列)
2015-02-04 03:31
501 查看
头文件:函数的定义
函数的声明
函数的应用
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h> typedef int ElemType; typedef struct Node { ElemType data; struct Node *next; }ListNode,*LinkList;//ListNode链表的结点类型,LinkList指向链表结点的指针类型 void InitList(LinkList *head);//单链表的初始化操作 int ListEmpty(LinkList head);//判断单链表是否为空 ListNode* Get(LinkList head,int i);//按序号查找操作 ListNode* LocateElem(LinkList head,ElemType e);//按内容查找操作 int LocatePos(LinkList head,ElemType e);//定位操作 int InsertList(LinkList head,int i,ElemType e);//插入操作 int DeleteList(LinkList head,int i,ElemType *e);//删除操作 int ListLength(LinkList head);//求表长操作 void DestroyList(LinkList head);//销毁链表操作
函数的声明
#include "链表.h" void InitList(LinkList *head)//单链表的初始化操作 { if((*head =(LinkList)malloc(sizeof(ListNode))) == NULL) { exit(-1); } (*head)->next = NULL; } int ListEmpty(LinkList head)//判断单链表是否为空 { if(head->next == NULL) { return 1; } else { return 0; } } ListNode* Get(LinkList head,int i)//按序号查找操作 { ListNode *p; int j = 0; p = head; if(ListEmpty(head))//在查找第i个元素之前,判断链表是否为空 { return NULL; } if (i < 1)//在查找第i个元素之前,判断链表是否合法 { return NULL; } while(p->next != NULL && j < i) { p = p->next ; j++; } if(j == i) { return p;//找到第i个结点,返回指针p } else { return NULL;//如果没有找到第i个结点,返回NULL } } ListNode* LocateElem(LinkList head,ElemType e)//按内容查找操作 { ListNode *p; p = head->next ;//指针p指向第一个节、结点 while(p) { if(p->data != e)//找到与e相等的元素,返回该序号 { p = p->next ; } else { break; } } return p; } int LocatePos(LinkList head,ElemType e)//定位操作 { ListNode *p; int i = 1; if(ListEmpty(head))//在查找第i个元素之前,判断链表是否为空 { return NULL; } p = head->next ; while(p) { if(p->data == e) { return i; } else { p = p->next ; i++; } } if(!p) { return 0; } } int InsertList(LinkList head,int i,ElemType e)//插入操作 { ListNode *p,*pre;//定义指向第i个元素的前驱指针pre,指针p指向新生成的结点 int j = 0; pre = head;//指针p指向头结点 while(pre->next != NULL && j < i-1)//找到i-1个结点,即第i个结点的前驱结点 { pre = pre->next ; j++; } if(j != i-1)//如果没找到则插入位置错误 { printf("插入位置错误"); return 0; } if((p = (ListNode*)malloc(sizeof(ListNode))) == NULL)//新生成一个结点,并将e赋值给该结点的数据域 { exit(-1); } p->data = e; p->next = pre->next;//插入结点操作 pre->next = p; return 1; } int DeleteList(LinkList head,int i,ElemType *e)//删除操作 { ListNode *pre,*p; pre = head; int j = 0; while(pre->next != NULL && pre->next->next != NULL && j < i-1)//判断是否找到前驱结点 { pre = pre->next ; j++; } if(j != i-1)//如果没有找到要删除的位置,说明删除结点位置错误 { printf("删除位置错误"); return 0; } p = pre->next;//指针p指向单链表中的第i个结点,并将该结点的数据域值赋值给e *e = p->data; pre->next = p->next;//将前驱结点的指针域指向要删除结点的下一个结点,也就是将p指向的结点与单链表断开 free(p);//释放p指向的节点 return 1; } int ListLength(LinkList head)//求表长操作 { ListNode *p; int count = 0; p = head; while(p->next != NULL) { p = p->next ; count++; } return count; } void DestroyList(LinkList head)//销毁链表操作 { ListNode *p,*q; p = head; while(p != NULL) { q = p; p = p->next ; free(q); } }
函数的应用
#include "链表.h" //单链表A和单链表B的元素都是非递减排列,利用单链表的基本运算,将它们合并成一个单链表C,要求C也是非递减序列。 void MergeList(LinkList A,LinkList B,LinkList *C) { ListNode *pa,*pb,*pc; pa = A->next ; pb = B->next ; *C = A; (*C)->next = NULL; pc = *C; while(pa && pb) { if(pa->data <= pb->data ) { pc->next = pa; pc = pa; pa = pa->next ; } else { pc->next = pb; pc = pb; pb = pb->next ; } } pc->next = pa ? pa : pb; free(B); } int main(void) { int i; ElemType a[] = {6,7,9,14,37,45,65,67}; ElemType b[] = {3,7,11,34,45,89}; LinkList A,B,C; ListNode *p; InitList(&A); InitList(&B); for(i = 1;i <= sizeof(a)/sizeof(a[0]);i++) { if(0 == InsertList(A,i,a[i-1])) { printf("位置不合法!"); return 0; } } for(i = 1;i <= sizeof(b)/sizeof(b[0]);i++) { if(0 == InsertList(B,i,b[i-1])) { printf("位置不合法!"); return 0; } } printf("单链表A中的元素有%d个\n",ListLength(A)); for(i = 1;i <= ListLength(A);i++) { p = Get(A,i); if(p) { printf("%4d",p->data); } } printf("\n"); printf("单链表B中的元素有%d个\n",ListLength(B)); for(i = 1;i <= ListLength(B);i++) { p = Get(B,i); if(p) { printf("%4d",p->data); } } printf("\n"); MergeList(A,B,&C); printf("将单链表A和单链表B中的元素合并到单链表C中的元素有%d个\n",ListLength(C)); for(i = 1;i <= ListLength(C);i++) { p = Get(C,i); if(p) { printf("%4d",p->data); } } printf("\n"); return 0; }
相关文章推荐
- 顺序表的应用举例(顺序表A和顺序表B的元素都是非递减排列,利用顺序表的基本运算,将它们合并成一个顺序表C,要求C也是非递减序列。)
- 单链表应用举例(利用单链表的基本运算,实现如果在A单链表中出现的元素在B单链表中也出现,则将A中的元素删除)
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 将两个递增的链表合并成一个递减的链表(相同的元素只留下一个),并要求利用原表结点
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 合并两个单链表(单链表元素均按值非递减排列)
- 要完整准确的 均以单链表作存储结构 试编写算法将A表和B表归并成一个按元素值递减有序的线性表C 【数据结构】假设有两个按元素值递增有序的线性表A和B 并要求利用原表的空间存放C。谁会么
- 写程序。设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,
- 顺序表的应用举例(利用顺序表的基本运算,实现如果在顺序表A中出现的元素,在顺序表B中也出现,则将A中该元素删除)
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 已知头指针分别为la和lb的有序单链表,其数据元素都是按值非递减排列。现要归并la和lb得到单链表lc,使得lc中的元素按值非递减排列。
- 已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序,要求用递归方法进行。
- 假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合,现要求另辟空间构成一个顺序链表C
- 已知两个链表 la和 lb,其元素值递增排序。编程将la和lb合并成一个递减有序(相同值元素只保留一个)的链表lc。(北方名校经典试题) 本题选做
- 将两个递增有序的单链表合并成一个递减有序的单链表,利用原结点空间
- 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数将其返回。 ⑤ 建立两个
- 线性表(二)——单链表(3)——单链表应用举例(3)—— 增序排列节点
- 10.10将A和B合并成一个按元素递减链表
- 将两个按元素值递增排序的单链表合并成一个按元素值递减的单链表