用C語言寫一個鏈表儲存學生信息


題目

已知學生基本信息由學號(長整型)、姓名(字符數組)、性別(字符型)、年齡(整型)組成。編程實現:建立一個結點按學號順序存儲學生信息的單向鏈表,並實現依據學號對鏈表的添加、修改、刪除和檢索功能;添加新結點后,應繼續保持結點按學號順序的鏈接方式。分別定義函數實現鏈表的初始化、鏈表的打印輸出、以及在鏈表中添加、修改、刪除和檢索節點的功能。

基本思路

建立單向鏈表,存儲學生數據,用不同函數實現上述功能,在主函數中調用函數進行操作。

代碼實現

定義結構體類型存儲信息

struct STUDENT_NODE {
	long int id;
	char name[MAX_LEN];
	char sex;
	int  age;
	// 指針指向下一個結點,用以形成鏈表
	struct STUDENT_NODE* next;
};
//定義結構體:存儲單向鏈表
struct STUDENT_LINK {
	struct STUDENT_NODE* top;
};
typedef struct STUDENT_NODE Node;
typedef struct STUDENT_LINK STUDENT_LINK;

在主函數中定義struct STUDENT_LINK類型的變量用於儲存鏈表

STUDENT_LINK * L,H;
    L = &H;

編寫建立鏈表的函數,(並且初始化)

void iniStudentLink(STUDENT_LINK* L)    //初始化學生鏈表
{
    Node* tail= NULL;
    L->top = NULL;
    Node* q;
    q = (Node*)malloc(sizeof(Node));
    scanf("%ld", &q->id);
    getchar();
    while (q->id != 0)
    {
        scanf("%s %c %d", q->name, &q->sex, &q->age);
        if (L->top == NULL)
        {
            L->top = q;
            L->top->next = NULL;
        }
        if (tail != NULL)//tail為開辟節點
        {
            tail->next = q;
        }
        tail = q;
        tail->next = NULL;
        q = (Node*)malloc(sizeof(Node));
        scanf("%ld", &q->id);
        getchar();
    }
}

輸出鏈表

void ShowALL(STUDENT_LINK* L)     // 從頭到尾,輸出當前所有的同學信息
{
    Node* p;
    p = L->top;
    if (p == NULL)
        printf("empty!\n");
    for (p = L->top; p != NULL; p = p->next)
        printf("%d %s %c %d\n", p->id, p->name, p->sex, p->age);
}

清空學生信息

void clearStudentLink(STUDENT_LINK* L)  //清空學生鏈表
{
    Node* p;
    while (L->top)
    {
        p = L->top;//p指向頭節點后的第一個節點
        L->top = p->next;//刪除節點p
        free(p);//釋放節點p的空間
    }
}

判斷學生的信息是否存在

int isExist(STUDENT_LINK* L, long int id)  // 判斷該學號的學生信息是否存在
{
    Node* p;
    p = L->top;
    while (p)
    {
        if (p->id == id)
            return 1;
        p = p->next;
    }
    return 0;
}

添加一個新的學生的信息

int Add(STUDENT_LINK* L, long int id, char name[], char sex, int age) //添加一個新同學的信息
{
    Node* temp = L->top;//創建臨時節點
    while (temp->next != NULL)
    {
        temp = temp->next;
    }
    Node* p = (Node*)malloc(sizeof(Node));//創建新節點
    p->id = id;
    strcpy(p->name, name);
    p->sex = sex;
    p->age = age;
    //向鏈表中插入節點
    p->next = temp->next;
    temp->next = p;
    return 0;
}

任意修改學生的信息

int Modify(STUDENT_LINK* L, long int id, char name[], char sex, int age) // 根據學號,修改該同學的信息
{
    Node* p = L->top;
    while (p->id != id)
    {
        p = p->next;
    }
    p->id = id;
    strcpy(p->name, name);
    p->sex = sex;
    p->age = age;
    return 0;
}

任意刪除學生的信息

int Delete(STUDENT_LINK* L, long int id) 	 // 根據學號,從鏈表中刪除該同學的信息
{
    Node* p1, * p2, * temp;
    if (isExist(L, id))
    {
        if (id == L->top->id)          /*刪除的是首元結點*/
        {
            temp = L->top;
            L->top = L->top->next;            /*解除首元節點與鏈表的連接*/
            free(temp);            /*釋放該結點的內存*/
        }
        else
        {
            p2 = L->top;
            p1 = p2->next;
            while (p1->id != id)
            {
                p2 = p1;
                p1 = p1->next;
            }

            temp = p1;
            p2->next = p1->next;
            free(temp);
        }
    }
    else
        printf("%ld not found\n", id);
    return 0;
}

檢索學生的信息

int Search(STUDENT_LINK* L, long int id)  // 根據學號,輸出顯示該同學信息
{
    if (isExist(L, id))
    {
        Node* p = L->top;
        while (p->id != id)
        {
            p = p->next;
        }
        printf("%ld %s %c %d\n", p->id, p->name, p->sex, p->age);
    }
    else
        printf("%ld not found\n", id);
    return 0;
}

完整代碼

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_LEN 5
struct STUDENT_NODE {
	long int id;
	char name[MAX_LEN];
	char sex;
	int  age;
	// 指針指向下一個結點,用以形成鏈表
	struct STUDENT_NODE* next;
};
//定義結構體:存儲單向鏈表
struct STUDENT_LINK {
	struct STUDENT_NODE* top;
};
typedef struct STUDENT_NODE Node;
typedef struct STUDENT_LINK STUDENT_LINK;
void iniStudentLink(STUDENT_LINK* L);    //初始化學生鏈表
void clearStudentLink(STUDENT_LINK* L);  //清空學生鏈表
int isExist(STUDENT_LINK* L, long int id);  // 判斷該學號的學生信息是否存在
int Add(STUDENT_LINK* L, long int id, char name[], char sex, int age); //添加一個新同學的信息 
int Modify(STUDENT_LINK* L, long int id, char name[], char sex, int age);  // 根據學號,修改該同學的信息
int Delete(STUDENT_LINK* L, long int id); 	 // 根據學號,從鏈表中刪除該同學的信息
int Search(STUDENT_LINK* L, long int id);  // 根據學號,輸出顯示該同學信息
void ShowALL(STUDENT_LINK* L);      // 從頭到尾,輸出當前所有的同學信息

int main()
{
	STUDENT_LINK * L,H;
    L = &H;
    int age;
    char sex;
    char name[MAX_LEN];
    long int id;

	iniStudentLink(L);
    printf("此時學生信息表為:\n");
    ShowALL(L);

    printf("輸入添加的id:\n");
    scanf("%ld", &id);
    getchar();
    printf("輸入添加同學的數據:\n");
    scanf("%s %c %d", name, &sex, &age);
    getchar();
    Add(L, id, name, sex, age);
    printf("添加后:\n");
    ShowALL(L);

    printf("輸入修改的id:\n");
    scanf("%ld", &id);
    getchar();
    printf("輸入修改后的信息:\n");
    scanf("%s %c %d", name, &sex, &age);
    getchar();
    Modify(L, id, name, sex, age);
    printf("修改后:\n");
    ShowALL(L);

    printf("輸入刪除的id:\n");
    scanf("%ld", &id);
    getchar();
    Delete(L, id);
    printf("刪除之后:\n");
    ShowALL(L);

    printf("輸入查找的id:\n");
    scanf("%d", &id);
    getchar();
    printf("該學生的信息為:\n");
    Search(L, id);

    printf("清除所有信息!\n");
    clearStudentLink(L);
    printf("清除后的信息表為:\n");
    ShowALL(L);
	return 0;
}
void iniStudentLink(STUDENT_LINK* L)    //初始化學生鏈表
{
    Node* tail= NULL;
    L->top = NULL;
    Node* q;
    q = (Node*)malloc(sizeof(Node));
    scanf("%ld", &q->id);
    getchar();
    while (q->id != 0)
    {
        scanf("%s %c %d", q->name, &q->sex, &q->age);
        if (L->top == NULL)
        {
            L->top = q;
            L->top->next = NULL;
        }
        if (tail != NULL)//tail為開辟節點
        {
            tail->next = q;
        }
        tail = q;
        tail->next = NULL;
        q = (Node*)malloc(sizeof(Node));
        scanf("%ld", &q->id);
        getchar();
    }
}
void ShowALL(STUDENT_LINK* L)     // 從頭到尾,輸出當前所有的同學信息
{
    Node* p;
    p = L->top;
    if (p == NULL)
        printf("empty!\n");
    for (p = L->top; p != NULL; p = p->next)
        printf("%d %s %c %d\n", p->id, p->name, p->sex, p->age);
}
void clearStudentLink(STUDENT_LINK* L)  //清空學生鏈表
{
    Node* p;
    while (L->top)
    {
        p = L->top;//p指向頭節點后的第一個節點
        L->top = p->next;//刪除節點p
        free(p);//釋放節點p的空間
    }
}
int isExist(STUDENT_LINK* L, long int id)  // 判斷該學號的學生信息是否存在
{
    Node* p;
    p = L->top;
    while (p)
    {
        if (p->id == id)
            return 1;
        p = p->next;
    }
    return 0;
}
int Add(STUDENT_LINK* L, long int id, char name[], char sex, int age) //添加一個新同學的信息
{
    Node* temp = L->top;//創建臨時節點
    while (temp->next != NULL)
    {
        temp = temp->next;
    }
    Node* p = (Node*)malloc(sizeof(Node));//創建新節點
    p->id = id;
    strcpy(p->name, name);
    p->sex = sex;
    p->age = age;
    //向鏈表中插入節點
    p->next = temp->next;
    temp->next = p;
    return 0;
}
int Modify(STUDENT_LINK* L, long int id, char name[], char sex, int age) // 根據學號,修改該同學的信息
{
    Node* p = L->top;
    while (p->id != id)
    {
        p = p->next;
    }
    p->id = id;
    strcpy(p->name, name);
    p->sex = sex;
    p->age = age;
    return 0;
}
int Delete(STUDENT_LINK* L, long int id) 	 // 根據學號,從鏈表中刪除該同學的信息
{
    Node* p1, * p2, * temp;
    if (isExist(L, id))
    {
        if (id == L->top->id)          /*刪除的是首元結點*/
        {
            temp = L->top;
            L->top = L->top->next;            /*解除首元節點與鏈表的連接*/
            free(temp);            /*釋放該結點的內存*/
        }
        else
        {
            p2 = L->top;
            p1 = p2->next;
            while (p1->id != id)
            {
                p2 = p1;
                p1 = p1->next;
            }

            temp = p1;
            p2->next = p1->next;
            free(temp);
        }
    }
    else
        printf("%ld not found\n", id);
    return 0;
}
int Search(STUDENT_LINK* L, long int id)  // 根據學號,輸出顯示該同學信息
{
    if (isExist(L, id))
    {
        Node* p = L->top;
        while (p->id != id)
        {
            p = p->next;
        }
        printf("%ld %s %c %d\n", p->id, p->name, p->sex, p->age);
    }
    else
        printf("%ld not found\n", id);
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM