写程序建立一个链表,每个结点包括:学号、姓名、性别、年龄,输入一个学号,如果链表中的结点包括该学号,则输出该结点内容后,并将其结点删去。
时间: 2023-05-31 13:20:58 浏览: 185
删除结点操作-C 学习PPt
### 回答1:
下面是一个使用 Python 实现的链表程序示例:
```python
class Node:
def __init__(self, sid, name, gender, age):
self.sid = sid
self.name = name
self.gender = gender
self.age = age
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def add_node(self, sid, name, gender, age):
new_node = Node(sid, name, gender, age)
if self.head is None:
self.head = new_node
return
current = self.head
while current.next:
current = current.next
current.next = new_node
def delete_node(self, sid):
if self.head is None:
return
if self.head.sid == sid:
self.head = self.head.next
return
current = self.head
while current.next:
if current.next.sid == sid:
current.next = current.next.next
return
current = current.next
def search_node(self, sid):
current = self.head
while current:
if current.sid == sid:
return current
current = current.next
if __name__ == '__main__':
ll = LinkedList()
ll.add_node(1, '张三', '男', 20)
ll.add_node(2, '李四', '女', 22)
ll.add_node(3, '王五', '男', 25)
ll.add_node(4, '赵六', '女', 21)
sid = int(input("请输入学号:"))
node = ll.search_node(sid)
if node:
print("学号:", node.sid)
print("姓名:", node.name)
print("性别:", node.gender)
print("年龄:", node.age)
ll.delete_node(sid)
else:
print("未找到该学号的结点")
```
该程序定义了一个链表类 `LinkedList` 和一个链表结点类 `Node`。在 `LinkedList` 类中,有三个方法,分别是:
1. `add_node`: 向链表中添加一个结点
2. `delete_node`: 删除链表中某个结点
3. `search_node`: 查询链表中某个结点的信息。程序中的主函数中使用了这三个方法,首先添加了几个结点,然后输入一个学号,查询该学号是否在链表中,如果在则输出该结点的信息并删除该结点,如果不在则输出未找到该学号的结点。
### 回答2:
链表是一种常用的数据结构,它由一系列结点组成,每个结点包含一个数据元素和一个指向下个结点的指针。链表可以根据需求扩展、增删元素,非常适合存储动态数据。
在建立一个链表时,需要定义一个结构体来表示每个结点的数据内容。以学生信息为例,定义的结构体包括学号、姓名、性别和年龄等信息。接着,可以通过循环创建多个结点,并将它们按照顺序连接起来,形成一个链表。
当输入一个学号时,需要遍历整个链表查找是否存在该结点。如果找到了,就可以输出该结点的信息,并将其从链表中删除。这可以通过调整结点的指针来实现。具体来说,遍历链表找到该结点的前一个结点,然后将前一个结点的指针指向该结点的下一个结点,最后释放该结点的内存空间即可。
除了删除结点,链表还可以支持插入结点、修改结点等操作,这些都可以利用链表的特性实现。链表虽然灵活便捷,但也需要考虑一些问题,比如遍历效率低下、内存空间分散等问题。因此,在实际应用中,需要结合具体情况选择合适的数据结构。
### 回答3:
链表是一种广泛应用的数据结构,它可以动态地管理数据,并且能够高效地插入和删除数据。所以我们可以用链表来建立学生信息的存储结构。
建立链表可以采用如下步骤:
1.定义链表的结构体。我们定义一个结构体来表示每个学生的信息,包括学号、姓名、性别、年龄和指向下一个结点的指针。
2.创建链表。我们定义一个头结点来标识整个链表,然后不断向链表中添加新的结点。添加结点时,我们可以使用头插法或尾插法。
3.输入学号并查找。我们可以输入一个学号来查找该学生的信息。遍历链表,如果找到了该学号对应的结点,则输出该结点内容。否则提示“该学号不存在”。
4.删除结点。如果找到了待删除的结点,则将该结点从链表中删除。由于链表中只存储指向下一个结点的指针,所以删除结点需要记录待删除结点的前一个结点,然后修改前一个结点的指针。
具体的代码实现如下:
struct student{
int ID; //学号
char name[20]; //姓名
char gender[5]; //性别
int age; //年龄
struct student* next; //指向下一个结点的指针
};
//创建一个链表
void createLinkedList(struct student* head){
struct student* p; //定义一个指向结点的指针
int ID;
printf("请输入学号,输入-1结束:");
scanf("%d",&ID);
while(ID != -1){
//创建一个新结点
p = (struct student*)malloc(sizeof(struct student));
p->ID = ID;
printf("请输入姓名、性别和年龄:");
scanf("%s%s%d",p->name,p->gender,&p->age);
//将新结点插入链表中
p->next = head->next;
head->next = p;
printf("请输入学号,输入-1结束:");
scanf("%d",&ID);
}
}
//查找并删除结点
void findAndDelete(struct student* head,int ID){
struct student* p = head->next; //从第一个结点开始查找
struct student* q = head; //用于记录待删除结点的前一个结点
while(p != NULL && p->ID != ID){ //查找该学号对应的结点
q = p;
p = p->next;
}
if(p == NULL){ //如果找不到该学号对应的结点
printf("该学号不存在!\n");
}
else{ //找到了该学号对应的结点
printf("学号:%d,姓名:%s,性别:%s,年龄:%d\n",p->ID,p->name,p->gender,p->age);
q->next = p->next; //将待删除结点从链表中删除
free(p); //释放存储该结点的内存
}
}
int main(){
struct student head; //定义头结点
head.next = NULL; //初始化为空链表
createLinkedList(&head); //创建链表
int ID;
printf("请输入学号:");
scanf("%d",&ID);
findAndDelete(&head,ID); //查找并删除结点
return 0;
}
以上代码可以实现所述功能,但是对于链表的创建、查找和删除还可以采用更多的方法和技巧,相信随着对数据结构的深入学习,会有更优秀的算法和实现方法呈现在我们的眼前。
阅读全文