《C語言及程式設計》實踐專案——連結串列初步
【專案1-連結串列的合併】
輸入一個整數m,表示A連結串列的長度,再輸入m個數作為A連結串列中的m個數據元素,建立連結串列A,其頭指標為heada。輸入一個整數n,表示B連結串列的長度,再輸入n個數表示B連結串列中的n個數據元素,建立連結串列B,其頭指標為headb。輸入i、len、j,將要從單鏈表A中刪除自第i個元素起的共len個元素,然後將單鏈表A插入到單鏈表B的第j個元素之前。最後輸出操作後的連結串列B。
例如,輸入:
11
13 5 14 62 3 43 71 5 72 34 5 (11個數構成連結串列A)
15
5 20 3 53 7 81 5 42 6 8 4 6 9 10 23(15個數構成連結串列B )
1 3 5(從單鏈表A中刪除自第1個元素起的共3個元素,然後將單鏈表A插入到單鏈表B的第5個元素之前)
輸出:
5 20 3 53 62 3 43 71 5 72 34 5 7 81 5 42 6 8 4 6 9 10 23
[參考解答]
【專案2-拆分連結串列】
編寫一個函式將一個頭指標為a的單鏈表A分解成兩個單鏈表A和B,其頭指標分別為a和b,使得A連結串列中含有原連結串列A中序號為奇數的元素,而B連結串列中含有原連結串列A中序號為偶數的元素,且保持原來的相對順序。例,建立長度為7,元素為1 2 3 4 5 6 7的連結串列後,經拆分,得到兩個陣列A和B,其元素分別是1 3 5 7 和2 4 6
[參考解答]
【專案3 - 改造連結串列】
下面是一個建立動態連結串列的程式。閱讀程式,然後按要求改造程式。
#include <iostream>
using namespace std;
#include <stdio.h>
#include <malloc.h>
#define N 5
typedef struct NODE
{
int data; //結點的資料
struct NODE *next; //指向下一結點
} Node;
Node *head=NULL; //將連結串列頭定義為全域性變數,以便於後面操作
void make_list(); //建立連結串列
void out_list(); //輸出連結串列
int main( )
{
make_list();
out_list();
return 0;
}
void make_list()
{
int n;
Node *p;
printf("輸入若干正數(以0或一個負數結束)建立連結串列:" );
scanf("%d", &n);
while(n>0) //輸入若干正數建立連結串列,輸入非正數時,建立過程結束
{
p=(Node*)malloc(sizeof(Node)); //新建結點
p->data=n;
p->next=head; //新建的結點指向原先的連結串列頭
head=p; //連結串列頭賦值為新建的節點,這樣,新結點總是連結串列頭
scanf("%d", &n); //輸入下一個數,準備建立下一個結點
}
return;
}
void out_list()
{
Node *p=head;
printf("連結串列中的資料為:\n");
while(p!=NULL)
{
printf("%d ", p->data);
p=p->next;
}
printf("\n");
return;
}
在上面的程式基礎上定義下面的函式,實現相應的功能。
為簡便起見,每編寫一個函式,立刻在main函式中呼叫進行測試。
(1)編寫make_list2()函式建立連結串列,使建立連結串列時,後輸入的資料,將新輸入的數字對應的結點放在連結串列末尾。若輸入為3 5 2 9 4 7 0,建立的連結串列為:
(2)編寫函式void search(int x),輸出連結串列中是否有值為x的結點。
(3)編寫函式delete_first_node(),刪除連結串列中的第一個結點。
(4)編寫函式delete_node(int x),刪除結點值為x的結點。
(5)編寫make_list3()函式建立連結串列,使建立連結串列時,使結點中的資料呈現升序。若輸入為3 5 2 9 4 7 0,建立的連結串列為:
(6)編寫函式void insert(int x),將值為x的結點插入到由make_list3建立起來的有序連結串列中。
[參考解答]
【專案4-連結串列版通訊錄】
利用連結串列儲存資料,寫一個通訊錄程式,能夠記錄多個聯絡人的編號、姓名、性別、聯絡電話、地址,完成資料的錄入、新增、刪除、修改以及查詢功能。
[參考解答]