双向链表,链表求A与B差集,链表多项式相加,静态链表
来源:互联网 发布:php 去除重复的数组 编辑:程序博客网 时间:2024/05/16 18:49
双向链表
#include<stdio.h> #include<stdlib.h> #define ELEMTP int typedef struct Lnode { ELEMTP data; struct Lnode *prior; struct Lnode *next; }Lnode; Lnode *create()//尾插法建立双链表 { Lnode *head, *p, *p2; ELEMTP x; head = (Lnode *)malloc(sizeof(Lnode)); head->next = NULL; p = head; scanf_s("%d", &x); while (x != -1) { p2 = (Lnode *)malloc(sizeof(Lnode)); p2->data = x; // p2->next = p->next; p2->prior = p; p->next = p2; p = p->next; scanf_s("%d", &x); } p->next = NULL; return head; } Lnode *insert(Lnode *head,int i,ELEMTP x) { Lnode *p, *s;//s为要插入的结点 p = head; for (int k = 1; k <=i; k++) p = p->next; s = (Lnode *)malloc(sizeof(Lnode)); s->data = x; s->prior = p->prior;//将p的前驱结点p1作为s的前驱结点 s->next = p; p->prior->next = s; p->prior = s;//注意顺序不能乱了 return head; } Lnode *del(Lnode *head,int i) { Lnode *p; p = head; for (int k = 1; k <= i; k++) p = p->next; if (p == NULL)printf("位置不合法\n"); else if (p->next == NULL)//最后一个结点做特殊处理 { p->prior->next = NULL; free(p); } else { p->prior->next = p->next; p->next->prior = p->prior; free(p); } return head; } void outline(Lnode *head) { Lnode *p; p = head->next; while (p != NULL) { printf(" %2d", p->data); p = p->next; } } int main() { Lnode *head; int i; ELEMTP x; head = create(); outline(head); printf("\n要插入的位置"); scanf_s("%d", &i); printf("要插入的大小"); scanf_s("%d", &x); head = insert(head,i,x); outline(head); printf("\n要删除的位置"); scanf_s("%d", &i); head = del(head, i); outline(head); return 0; }
集合A用单链表La表示,集合B用单链表Lb表示,设计算法求A与B两个集合的差,即A-B
分析
A-B即属于A而不属于B的元素,对集合A的每个元素x,在集合B中进行查找,如果存在与x相同的元素,删除x在A中的结点。
#include<stdio.h>#include<stdlib.h>typedef struct Lnode{int data;struct Lnode *next;}Lnode;struct Lnode *create()//尾插法建立链表,不熟悉的请见数据结构之链表基础{Lnode *head, *p, *p2;head = (Lnode *)malloc(sizeof(Lnode));head->next = NULL;p = head;int x;scanf_s("%d", &x);while (x != -1){p2= (Lnode *)malloc(sizeof(Lnode));p2->data = x;p->next = p2;p = p2;scanf_s("%d", &x);}p->next = NULL;return head;}void outline(Lnode *head){Lnode *p;p = head->next;while (p != NULL){printf(" %2d", p->data);p = p->next;}}Lnode *chaji(Lnode *La, Lnode *Lb)//属于La而不属于Lb的元素{Lnode *p, *prep,*q,*r;prep = La;p = La->next;//p是La中的某一结点,prep是p的前驱结点;while (p != NULL){q = Lb->next;//依次扫描Lb看是否有与La表中p指向的结点相同的结点while (q && q->data != p->data)q = q->next;if (q != NULL)//在Lb中找到与La中p指向的结点相同的结点,删除p指向的结点{r = p;prep->next = p->next;//删除结点p = p->next;//指向下一个结点free(r);}else //未找到相同结点,继续在La中找,p指向下一个,s指向p前驱{prep = p; p = p->next;}}return La;}int main(){Lnode *La,*Lb;printf("输入La元素,-1结束\n");La= create();outline(La);printf("\n输入Lb元素,-1结束\n");Lb = create();outline(Lb);printf("\nLa与Lb的差集\n");La = chaji(La, Lb);outline(La);}
多项式相加
#include<stdio.h>#include<stdlib.h>#define OK 1#define Status inttypedef struct Lpoly{int coef; //系数int exp; //指数struct Lpoly *next;}Lpoly;Lpoly *CreatList(Lpoly *head,int n){Lpoly *p, *p2;head = (Lpoly *)malloc(sizeof(Lpoly));head->next = NULL;p = head;for (int i = 0; i < n; i++){p2 = (Lpoly *)malloc(sizeof(Lpoly));printf("coef:");scanf("%d", &(p2->coef));printf("exp:");scanf("%d", &(p2->exp));p->next = p2;p = p2;}p->next = NULL;return head;}void Print(Lpoly *head){Lpoly *p;p = head->next;while (p){printf("%dX^%d",p->coef,p->exp);if (p->next)printf("+");p = p->next;}printf("\n");}Lpoly *AddPolyn(Lpoly *La, Lpoly *Lb){Lpoly *pa, *pb,*pc,*Lc;pa = La->next; pb = Lb->next;Lc = pc = La;while (pa&&pb){if (pa->exp > pb->exp){pc->next = pa;pc = pa;pa = pa -> next;}else if (pa->exp < pb->exp){pc->next = pb;pc = pb;pb = pb->next;}else{if (pa->coef + pb->coef != 0){pa->coef = pa->coef + pb->coef;//注意是改变pa的系数,然后接在pc后面pc = pa;}pa = pa->next;pb = pb->next;}}pc->next = pa ? pa : pb;return Lc;}int main(){Lpoly *La, *Lb,*Lc;int na, nb;La = Lb = NULL;printf("创建La,降序,输入项数na:\n");scanf("%d", &na);La=CreatList(La, na);printf("创建Lb,降序,输入项数nb:\n");scanf("%d", &nb);Lb = CreatList(Lb, nb);printf("La为:");Print(La);printf("Lb为:");Print(Lb);Lc = AddPolyn(La, Lb);Print(Lc);return 0;}
静态链表
/*用数组描述的链表称为静态链表*/ #include <stdio.h> #include <stdlib.h> #define MAX 100 #define OK 1 #define Status int typedef struct { int data; int cur; }StackLinkList[MAX]; int av = -1, h = -1; Status Initlist(StackLinkList space)//初始化 { int i; for (i = 0; i<MAX - 1; i++) space[i].cur = i + 1; space[MAX - 1].cur = -1;//静态链表为空,最后一个元素的cur为-1; av = 0; return OK; } Status Insert(StackLinkList L, int x) { if (av == -1)printf("没有空位置\n"); else { int i; i = av; av = L[i].cur; L[i].data = x; L[i].cur = h; h = i; } return OK; } int Delete(StackLinkList L,int *x) { int i; if (h != -1)//h=-1表示静态链表全有元素 { *x = L[h].data; i = h; h = L[h].cur; L[i].cur = av; av = i; } return OK; } void Outline(StackLinkList L) { int H = h;//把h的值给H,否则会改变h的值 while (H != -1) { printf("%2d ", L[H].data); H = L[H].cur; } } int main() { StackLinkList L; int cord, result; do { printf("\n1.初始化静态链表\n"); printf("2.插入新元素\n"); printf("3.删除元素\n"); printf("4.显示\n"); scanf_s("%d", &cord); switch (cord) { case 1: { result = Initlist(L); if (result == OK)printf("成功初始化\n"); }break; case 2: { int x; printf("输入要插入的元素x: "); scanf_s("%d", &x); Insert(L, x); }break; case 3: { int x; if (Delete(L, &x)) printf("成功删除元素 %d\n", x); }break; case 4: { Outline(L); }break; } } while (cord<5); return 0; }
1 0
- 双向链表,链表求A与B差集,链表多项式相加,静态链表
- 多项式相加链表
- 链表实现多项式相加
- 链表实现多项式相加
- 链表实现多项式相加
- 求链表A与链表B的差集
- 链表实现的多项式相加相乘
- 利用链表计算多项式的相加
- 利用链表计算多项式的相加
- C++链表应用:多项式相加
- 数据结构之链表-多项式相加
- 链表实现多项式相加 相乘
- 链表算法六之多项式相加
- 链表应用-- 一元多项式相加
- 双链表&链表合并&多项式相加算法
- Java链表形式实现多项式相加
- 一元多项式相加-链表应用
- 链表之两个多项式相加
- Python __call__() (十四)
- freemarker教程
- [最小生成树+二进制枚举]UVa1151 - Buy or Build
- Linux下rz,sz与ssh,SecureCRT的配合使用
- [Linux]动态链接库静态替换
- 双向链表,链表求A与B差集,链表多项式相加,静态链表
- JS中几个常用的函数
- unique() 去重函数
- jni
- UITextView上下空白间距的问题处理
- zookeeper 只能本地访问的问题解决方法
- Java程序员面试中的多线程问题
- 实现网页中元素的拖拽功能
- iOS经典讲解之线程锁NSLock案例(卖火车票)