周次 |
学习时间 |
新编写代码行数 |
博客量(篇) |
学到知识点 |
第6周 |
约400 |
1 |
单链表操作 |
#include"stdio.h" #include "stdafx.h" #include"stdlib.h" #include"windows.h" #pragma warning(disable :4996) typedef int Elemtype; typedef struct Node { Elemtype date; struct Node* next; }Node, *LinkList; int ListLength(LinkList L); //计算链表长度 void InitList(LinkList L); //初始化列表 void CreateFromHead(LinkList L); //头插法创建单链表 void CreateFromTail(LinkList L); //尾插法创建单链表 void SearchDate(LinkList L, Elemtype e); //单链表查找_按内容 void Searchsequ(LinkList L, int e); //单链表查找_按序号 void Insert(LinkList L, int local, Elemtype e); //单链表插入 void Myprint(LinkList L); //单链表输入函数 void MyprintLC(LinkList L); //合并链表后的LC的输出函数 int DelList(LinkList L, int local); //删除 void mergeLinkList(LinkList LA, LinkList LB, int len); //合并链表 void Reverse(LinkList L); //头插法逆置 void Divide(LinkList L); int main() { LinkList head; LinkList LB; int i; head = (Node*)malloc(sizeof(Node)); LB = (Node*)malloc(sizeof(Node)); head->next = NULL; LB->next = NULL; InitList(head); //CreateFromHead(head); CreateFromTail(head); Myprint(head); printf(" 逆置算法:"); Reverse(head); Myprint(head); printf(" 拆分算法: "); Divide(head); /* Elemtype seek = 0; printf(" 请输入查找的数值:"); scanf("%d", &seek); SearchDate(head, seek); printf(" 请输入查找的数值的序号:"); scanf("%d", &seek); Searchsequ(head, seek); */ int local; int insertelem; printf(" 请输入要插入的位置和值:"); scanf("%d%d", &local, &insertelem); Insert(head, local, insertelem); Myprint(head); Elemtype *e = 0; int result = -1; printf(" 请输入要删除的函数的序号:"); scanf("%d", &local); result = DelList(head, local); if (result != 0) { printf(" 删除成功!删除的元素为%d ", result); } else printf(" 删除失败,删除位置不合法! "); printf(" LA: "); Myprint(head); /* //头插法 Node *r; Elemtype temp; printf("请输入时按从大到小的顺序输入,为了后面的合并排序功能,因为只能合并2个升序链表"); printf(" 请输入LB的的值(数量与LA一致):"); result = ListLength(head); for (i = 0; i < result; i++) { scanf("%d", &temp); r = (Node*)malloc(sizeof(Node)); r->date = temp; r->next = LB->next; LB->next = r; } */ Node *r, *s; Elemtype temp; r = LB; //printf("请输入时按从大到小的顺序输入,为了后面的合并排序功能,因为只能合并2个升序链表"); printf(" 请输入LB的的值(数量与LA一致):"); result = ListLength(head); for (i = 0; i < result; i++) { scanf("%d", &temp); s = (Node*)malloc(sizeof(Node)); s->date = temp; r->next = s; r = s; } r->next = NULL; printf(" LB: "); Myprint(LB); printf(" 按任意键进入合并单链表!"); system("pause"); mergeLinkList(head, LB, result); system("pause"); return 0; } void InitList(LinkList L) { L = (Node*)malloc(sizeof(Node)); L->next = NULL; } void CreateFromHead(LinkList L) //头插法建表 { printf(" "); printf("------------------------------ 单链表练习 -------------------------------------- "); Node *s; int date; int flag = 1; printf(" 请输入若干个整数(按0结束):"); while (flag) { scanf("%d", &date); if (date != 0) //按0退出 { s = (Node*)malloc(sizeof(Node)); s->date = date; s->next = L->next; L->next = s; } else flag = 0; } } void CreateFromTail(LinkList L) { printf(" "); printf("------------------------------ 单链表练习 -------------------------------------- "); Node *r, *s; int date; int flag = 1; r = L; printf(" 请输入若干个整数(按0结束):"); while (flag) { scanf("%d", &date); if (date != 0) { s = (Node*)malloc(sizeof(Node)); s->date = date; r->next = s; r = s; } else { flag = 0; r->next = NULL; } } } void SearchDate(LinkList L, Elemtype e) //按内容查找 { Node*p; p = L->next; while (p != NULL) { if (p->date == e) break; p = p->next; } if (p == NULL) printf("No Find "); else printf(" Find "); } void Searchsequ(LinkList L, int e) //按序号查找 { Node*p; p = L; int i; for (i = 0; i < e; i++) { p = p->next; } if (p == NULL) { printf("查找位置不合法!"); } else printf("第%d个元素是%d ", e, p->date); } void Insert(LinkList L, int local, Elemtype e) //插入函数 { Node *s; s = (Node*)malloc(sizeof(Node)); s->date = e; Node *p; p = L; int i; for (i = 1; i < local; i++) { p = p->next; } s->next = p->next; p->next = s; } void Myprint(LinkList L) //输出函数 { Node *p; p = L; p = p->next; int i; int count = ListLength(L); for (i = 0; i < count; i++) { printf("%d ", p->date); p = p->next; } } void MyprintLC(LinkList L) //输出函数 { Node *p; p = L; p = p->next; int i; int count = ListLength(L); while (p != NULL) { printf("%d ", p->date); p = p->next; } } int ListLength(LinkList L) //单链表长度 { int count = 0; Node *p; p = L; p = p->next; while (p != NULL) { count++; p = p->next; } return count; } int DelList(LinkList L, int local) { Node *p, *r; int i; p = L; Elemtype e; for (i = 1; i < local; i++) { if (p->next == NULL) { return 0; } p = p->next; } r = p->next; p->next = r->next; e = r->date; free(r); return e; } void mergeLinkList(LinkList LA, LinkList LB, int len) //合并链表 { Node *pa, *pb, *r; LinkList LC; int i; pa = LA->next; pb = LB->next; LC = LA; LC->next = NULL; r = LC; while (pa != NULL && pb != NULL) { if (pa->date <= pb->date) { r->next = pa; r = pa; pa = pa->next; } else { r->next = pb; r = pb; pb = pb->next; } if (pa) r->next = pa; else r->next = pb; } MyprintLC(LC); } void Reverse(LinkList L) { Node *p,*s; LinkList LB; int count = 0,i; LB=(Node*)malloc(sizeof(Node)); LB->next = NULL; p = L; count = ListLength(L); for (i = 0;i < count;i++) { p = p->next; s = (Node*)malloc(sizeof(Node)); s->date = p->date; s->next = LB->next; LB->next = s; } p = L; for (i = 0;i < count;i++) { p = p->next; LB = LB->next; p->date = LB->date; } free(LB); } void Divide(LinkList L) { int i,count; Node *p,*pa,*pb; LinkList LA, LB; LB = (Node*)malloc(sizeof(Node)); LB->next = NULL; p = L->next; LA = L; LA->next = NULL; pa = LA; pb = LB; while(p!=NULL) { if (p->date % 2 == 0) { pb->next = p; pb = p; p = p->next; } else { pa->next = p; pa = p; p = p->next; } } pa->next = NULL; pb->next = NULL; printf(" LA:"); count = ListLength(LA); pa = LA->next; pb = LB->next; for (i = 0;i < count;i++) { printf("%d ",pa->date); pa = pa->next; } printf(" LB:"); count = ListLength(LB); for (i = 0;i < count;i++) { printf("%d ", pb->date); pb = pb->next; } system("pause"); }