作业1
题目
双向链表
结果
代码
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
dbl_l_st l = create_head();
// 头插
printf("头插\n");
datatype es[5] = {"hello","world","ok","123","haha"};
for (int i = 0; i < 5; i++){
list_head_insert(l, es[i]);
}
list_to_string(l);
// 尾插
printf("尾插\n");
datatype es2[5] = {"qwe","asd","gg","456","ohh"};
for (int i = 0; i < 5; i++){
list_rear_insert(l, es2[i]);
}
list_to_string(l);
// 头删
list_head_del(l);
printf("头删\n");
list_to_string(l);
// 尾删
list_rear_del(l);
printf("尾删\n");
list_to_string(l);
// 按位置插入
datatype e;
printf("位置3,插入three:\n");
strcpy(e,"three");
list_pos_insert(l, 3, e);
list_to_string(l);
// 按位置修改
printf("位置1,修改为111:\n");
strcpy(e,"111");
list_pos_modify(l, 1, e);
list_to_string(l);
// 按位置删除
printf("位置4,删除:\n");
list_pos_del(l, 4);
list_to_string(l);
// 按位置查找
printf("位置2,查找:\n");
list_pos_search(l, 2);
return 0;
}
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char datatype[20];
typedef struct Node {
union {
int len;
datatype data;
};
struct Node *next;
struct Node *prev;
} *dbl_l_st;
dbl_l_st create_head();
dbl_l_st create_Node();
int list_head_insert(dbl_l_st l, datatype e);
void list_to_string(dbl_l_st l);
int list_rear_insert(dbl_l_st l, datatype e);
int list_head_del(dbl_l_st l);
int list_rear_del(dbl_l_st l);
int list_pos_insert(dbl_l_st l, int pos, datatype e);
int list_pos_modify(dbl_l_st l, int pos, datatype e);
int list_pos_del(dbl_l_st l, int pos);
int list_pos_search(dbl_l_st l, int pos);
#endif
func.c
#include "head.h"
// 创建头结点
dbl_l_st create_head()
{
dbl_l_st l = (dbl_l_st)malloc(sizeof(struct Node));
if (l == NULL)
return NULL;
l->len = 0;
l->next = NULL;
l->prev = NULL;
return l;
}
// 创建普通结点
dbl_l_st create_Node()
{
dbl_l_st p = (dbl_l_st)malloc(sizeof(struct Node));
if (p == NULL)
return NULL;
strcpy(p->data, "");
p->next = NULL;
p->prev = NULL;
return p;
}
// 头插
int list_head_insert(dbl_l_st l, datatype e)
{
if (l == NULL) {
return -1;
}
dbl_l_st s = create_Node();
if (s == NULL)
return -1;
strcpy(s->data, e);
s->next = l->next;
s->prev = l;
if (l->next != NULL)
l->next->prev = s;
l->next = s;
l->len++;
return 0;
}
// 输出
void list_to_string(dbl_l_st l)
{
if (l == NULL || l->len == 0) {
printf("输出失败\n");
return;
}
dbl_l_st p = l;
while (p->next != NULL) {
p = p->next;
printf("%s ", p->data);
}
printf("\n");
}
// 尾插
int list_rear_insert(dbl_l_st l, datatype e)
{
if (l == NULL) {
printf("插入失败\n");
return -1;
}
dbl_l_st p = l;
while (p->next != NULL) {
p = p->next;
}
dbl_l_st s = create_Node();
if (s == NULL)
return -1;
strcpy(s->data, e);
p->next = s;
s->prev = p;
l->len++;
return 0;
}
// 头删
int list_head_del(dbl_l_st l)
{
if (l == NULL || l->len == 0) {
printf("删除失败\n");
return -1;
}
dbl_l_st q = l->next;
l->next = q->next;
if (q->next != NULL) {
q->next->prev = l;
}
l->len--;
return 0;
}
// 尾删
int list_rear_del(dbl_l_st l)
{
if (l == NULL || l->len == 0) {
printf("删除失败\n");
return -1;
}
dbl_l_st p = l;
for (int i = 0; i < l->len; i++) {
p = p->next;
}
p->prev->next = p->next;
free(p);
p = NULL;
l->len--;
return 0;
}
// 按位置插入
int list_pos_insert(dbl_l_st l, int pos, datatype e)
{
if (l == NULL || pos < 1 || pos > l->len + 1) {
printf("插入失败\n");
return -1;
}
dbl_l_st p = l;
for (int i = 0; i < pos - 1; i++) {
p = p->next;
}
dbl_l_st s = create_Node();
if (s == NULL)
return -1;
strcpy(s->data, e);
s->next = p->next;
s->prev = p;
if (p->next != NULL)
p->next->prev = s;
p->next = s;
l->len++;
return 0;
}
// 按位置修改
int list_pos_modify(dbl_l_st l, int pos, datatype e)
{
if (l == NULL || pos < 1 || pos > l->len) {
printf("修改失败\n");
return -1;
}
dbl_l_st p = l;
for (int i = 0; i < pos; i++) {
p = p->next;
}
strcpy(p->data, e);
return 0;
}
// 按位置删除
int list_pos_del(dbl_l_st l, int pos)
{
if (l == NULL || pos < 1 || pos > l->len) {
printf("删除失败\n");
return -1;
}
dbl_l_st p = l;
for (int i = 0; i < pos; i++) {
p = p->next;
}
p->prev->next = p->next;
if (p->next != NULL)
p->next->prev = p->prev;
free(p);
p = NULL;
l->len--;
return 0;
}
// 按位置查找
int list_pos_search(dbl_l_st l, int pos)
{
if (l == NULL || pos < 1 || pos > l->len) {
printf("查找失败\n");
return -1;
}
dbl_l_st p = l;
for (int i = 0; i < pos; i++) {
p = p->next;
}
printf("该位置的值是:%s\n", p->data);
return 0;
}