- 要求
设计算法,将一个带头结点的单链表A分解为两个带头结点的单链表A和B,
使得A表中含有原表中序号为奇数的元素,而B表中含有原表中序号为偶数的元素
且保持其相对顺序不变
结点定义
1 2 3 4 5
| typedef struct node { ElemType element; struct node* link; }Node;
|
带头结点的单链表定义,head作为头节点
1 2 3 4 5
| typedef struct headerList { Node* head; int n; }HeaderList;
|
初始化运算:生成空表
1 2 3 4 5 6 7 8 9 10
| int Init(HeaderList* h) { h->head = (Node*)malloc(sizeof(Node)); if (!h->head) return 0;
h->head->link = NULL; h->n = 0; return 1; }
|
查找运算:根据下标i查找元素,并通过x返回值
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| int Find(HeaderList L, int i, ElemType* x) { Node* p; int j; if (i < 0 || i > L.n-1) return 0;
p = L.head->link; for (j = 0; j < i; j++) p = p->link;
*x = p->element; return 1; }
|
插入运算:根据下标i插入元素x
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| int Insert(HeaderList* h, int i, ElemType x) { Node* p, * q; int j; if (i<-1 || i>h->n - 1) return 0;
p = h->head; for (j = 0; j <= i; j++) p = p->link;
q = (Node*)malloc(sizeof(Node));
q->element = x; q->link = p->link; p->link = q; h->n++; return 1; }
|
输出运算:输出链表的所有元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| int Output(HeaderList* L) { Node* p; if (!L->n) return 0;
p = L->head->link; while (p) { printf("%d ", p->element); p = p->link; }
return 1; }
|
主程序步骤
1.先生成原链表A和待存储链表M和N,以及对应的下标m和n
(M储存原来序号为奇数的元素,N储存原来序号为偶数的元素)
2.使用查找运算遍历链表A,用变量x存储返回值
3.用if语句根据下标的奇偶性将a插入链表M和N中
4.当链表A遍历完成后,输出链表A、M和N,验证程序是否有错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| int main() { HeaderList A, M, N; int i, m = 0, n = 0; int x;
Init(&A); Init(&M); Init(&N);
for (i = 0; i < 9; i++) Insert(&A, i - 1, i); printf("原List:"); Output(&A);
for (i = 0; i < 9; i++) { Find(A, i, &x); if (i % 2 == 1) { Insert(&M, m - 1, x); m++; } else { Insert(&N, n - 1, x); n++; } }
printf("\nList(奇数下标):"); Output(&M); printf("\nList(偶数下标):"); Output(&N); }
|
输出结果
1 2 3 4 5 6
| 原List:0 1 2 3 4 5 6 7 8 List(奇数下标):1 3 5 7 List(偶数下标):0 2 4 6 8 E:\Buildings\c\数据结构与算法作业\第二章作业\x64\Debug\第二章作业.exe (进程 12624)已退出,代码为 0 (0x0)。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .
|