1. 程式人生 > >《C語言及程式設計》實踐專案——連結串列初步

《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-連結串列版通訊錄】
利用連結串列儲存資料,寫一個通訊錄程式,能夠記錄多個聯絡人的編號、姓名、性別、聯絡電話、地址,完成資料的錄入、新增、刪除、修改以及查詢功能。
[參考解答]