#include <stdio.h> #include <stdlib.h> //定义结点结构体 typedef struct student { //数据域 int num; //学号 int score; //分数 char name[20]; //姓名 //指针域 struct student *next; }STU; void link_creat_head(STU **p_head,STU *p_new) { STU *p_mov = *p_head; if(*p_head == NULL) //当第一次加入链表为空时,head执行p_new { *p_head = p_new; p_new->next=NULL; } else //第二次及以后加入链表 { while(p_mov->next!=NULL) { p_mov=p_mov->next; //找到原有链表的最后一个节点 } p_mov->next = p_new; //将新申请的节点加入链表 p_new->next = NULL; } } int main() { STU *head = NULL,*p_new = NULL; int num,i; printf("请输入链表初始个数:\n"); scanf("%d",&num); for(i = 0; i < num;i++) { p_new = (STU*)malloc(sizeof(STU));//申请一个新节点 printf("请输入学号、分数、名字:\n"); //给新节点赋值 scanf("%d %d %s",&p_new->num,&p_new->score,p_new->name); link_creat_head(&head,p_new); //将新节点加入链表 } return 0; }
这段代码实现了一个头插法创建链表的功能。用户输入要创建的节点数,然后依次输入每个节点的数据,再将新节点插入到链表的头部。具体实现过程如下:
定义了一个名为STU的结构体,包含了学号、分数、姓名等数据域,以及一个指向下一个节点的指针域。
定义了一个函数link_creat_head,它有两个参数:一个是头指针的地址,另一个是要插入的新节点的地址。该函数首先判断链表是否为空,如果是,则将头指针指向新节点,并将新节点的指针域设为NULL;如果不为空,则遍历链表找到最后一个节点,将最后一个节点的指针域指向新节点,并将新节点的指针域设为NULL。
在main函数中,先定义了头指针和新节点指针,并将头指针初始化为NULL。然后用户输入要创建的节点数,以及每个节点的数据,将新节点插入到链表的头部。
需要注意的是,在使用完链表后,要释放所有节点的内存空间,避免内存泄漏。
# include < stdio. h> # include < stdlib. h> typedef int ElemType; typedef struct LNode { ElemType
这是一个C语言程序中的部分代码,涉及到头文件的包含和数据结构的声明。#include <stdio.h>
和 #include <stdlib.h>
是用来引入标准输入输出库以及标准库函数,如内存管理和I/O操作。
typedef int ElemType;
定义了一个新的类型别名 ElemType
,通常在数据结构中用于元素类型,例如链表中的节点元素。
接着,typedef struct LNode
开始定义一个名为 LNode
的结构体,这通常是用来表示链表的节点。在链表中,每个节点一般包含两个部分:一个是存储数据的域(ElemType data;
,这个部分会被 ElemType
替换),另一个可能是指向下一个节点的指针(struct LNode* next;
)。完整的结构体可能会像这样:
typedef int ElemType;
typedef struct LNode {
ElemType data; // 节点的数据域
struct LNode* next; // 指向下一个节点的指针
} LNode;
//整个程序禁止使用同名变量名//程序框架不要动//形参需不需要引用自行调整 using namespace std; #include<iostream> #include <string.h> #include <stdio.h> #include <math.h> #include <stdlib.h> #define MAXSIZE 10 typedef struct{//定义数据元素结构体//至少有学号和成绩两个成员}istudent; typedef struct node[//定义链表结构体,参照书上定义}LNode.*LinkList; InitList(LinkList &L1){//新建带头结点空链表} InitValue(LinkList &L2){//用前插法插入学号4开始往后数,15位同学,要求链表中学号从小到大排列} GetElem(LinkList &L3,int i,ElemType e){//查找单链表L中第i个元素,如果查找成功,输出该元素信息,如果查找失败,输出“查找失败"} Listinsert(LinkList &L4,int i,ElemType e) {//单链表L中第i个元素位置之前插入数据元素e} int DeleteLinkList( LinkList &L5, int i) {//在链表中删除第i个结点} int show( LinkList &L6) {//输出所有链表数据} int DestroyList( LinkList &L7,int i){//释放链表中所有结点} //主程序,所有功能通过调用函数实现//定义一个链表变量//新建一个空链表 int main(){ //用前插法插入学生数据元素,//输出所有链表数据 //查找链表中第i(i=自己学号个位+5)个学生,输出该生的学号和成绩//查找链表中第25个学生,输出该生的信息;如查找不到,输出“查找失败,无第25个”//在第i(i=自己学号个位+3)个元素前插入一个元素(自己学号+15)同学//输出所有链表数据//删除链表中第i(i=自己学号个位+6)个元素//输出所有链表数据 //用free函数释放链表中所有结点的存储空间system("pause"); return 0; } 用C语言补充代码,完成注释要求
单链表基本操作的实现
为了构建一个完整的单链表程序,该程序应具备初始化、插入、删除、查找以及销毁的功能。以下是基于C语言的具体实现方法。
初始化函数
定义InitList
用于创建一个新的空列表,并分配内存给头指针[^1]。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} LinkNode;
// 创建并返回新节点
LinkNode* CreateNewNode(int value) {
LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
if (!newNode) exit(-1);
newNode->data = value;
newNode->next = NULL;
return newNode;
}
int InitList(LinkNode** L) {
(*L) = CreateNewNode(0); // 头结点的数据域可以不使用
if ((*L) == NULL){
printf("Out of memory\n");
return 0;
}
(*L)->next = NULL;
return 1;
}
插入函数
通过InsertList
可以在指定位置之前加入新的元素。
void InsertList(LinkNode* head, int pos, int elem) {
if(pos<0 || !head) return ;
LinkNode *p,*q;
q = CreateNewNode(elem);
p=head;
while(--pos && p !=NULL)
p=p->next;
if(!p) return ;
q->next = p->next;
p->next=q;
}
查找函数
利用FindElem
来定位特定数值所在的索引位置。
int FindElem(LinkNode* head, int target) {
int index = 0;
LinkNode* current = head->next; // 跳过头结点
while(current != NULL){
if(current->data == target){
break;
}
++index;
current=current->next;
}
if(current==NULL){
return -1; // Not found
}else{
return index+1; // 返回实际下标(从1开始)
}
}
删除函数
借助DeleteElem
移除位于某处的目标项。
void DeleteElem(LinkNode* head, int pos) {
if(head==NULL||pos<=0) return ;
LinkNode *pre,*cur;
pre=head;
cur=pre->next;
for(int i=1;i<pos&&cur!=NULL;++i){
pre=cur;
cur=cur->next;
}
if(cur==NULL) return ; // Position out of range or list empty
free(cur);
pre->next=cur->next;
}
销毁函数
最后,DestroyList
负责释放整个链表所占用的空间资源[^3]。
void DestroyList(LinkNode **L) {
LinkNode *current=*L,*temp;
while(current != NULL){
temp=current->next;
free(current);
current=temp;
}
*L=NULL;
}
以上即为单链表的主要操作接口的设计与编码方式,在此基础上还可以扩展更多实用特性,比如逆序打印或者合并两个有序链表等高级功能。
相关推荐

















