Q2:整数序列保存在双向链表中,实现如下操作:
(1)创建;
(2)遍历输出;
(3)按值查找;
(4)按位序插入;
(5)按位序删除;
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct Dnode
{
ElemType data;
struct Dnode* pre;
struct Dnode* next;
}Dnode, *DLinkList;
int initDLinkList(DLinkList* L)
{
*L = (DLinkList)malloc(sizeof(Dnode));
if (*L == NULL)
return 0;
(*L)->next = NULL; //双向循环链表就是(*L)->next = (*L)->pre = *L;
(*L)->pre = NULL;
return 1;
}
int PrintList(DLinkList L)
{
DLinkList p = L->next;
while (p == NULL)
return 0;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return 1;
}
int insertList(DLinkList L,ElemType e,int i)
{
DLinkList p = L,q;
int pos = 0;
while (p->next != NULL && pos < i - 1)
{
pos++;
p = p->next;
}
if (p->next == NULL || pos > i - 1)
return 0;
q = (DLinkList)malloc(sizeof(Dnode));
q->data = e;
q->next = p->next;
q->pre = p;
p->next = q;
return 1;
}
int deleteList(DLinkList L, int i)
{
DLinkList p = L, q;
int pos = 0;
while (p->next != NULL && pos < i - 1)
{
pos++;
p = p->next;
}
if (p->next == NULL || pos > i - 1)
return 0;
q = p->next;
p->next = q->next;
q->next->pre = p;
free(q);
return 1;
}
int locationList(DLinkList L,int e)
{
DLinkList p = L->next;
int pos = 1;
while (p)
if (p->data != e) {
p = p->next;
pos++;
}
else
return pos;
if (p == NULL)
return 0;
}
int creatList(DLinkList *L)
{
initDLinkList(L);
DLinkList p = *L, q;
ElemType e;
char yn;
int i = 1;
do
{
printf("请输入第%d个元素:", i);
scanf("%d", &e);
q = (DLinkList)malloc(sizeof(Dnode));
q->data = e;
q->next = NULL;
q->pre = p;
p->next = q;
p = p->next;
i++;
getchar();
printf("是否继续输入?Y/N ");
yn = getchar();
} while (yn == 'Y' || yn == 'y');
return 1;
}
int main()
{
DLinkList L;
if (creatList(&L))
printf("初始化成功!\n");
else
printf("初始化失败!\n");
printf("\n请选择需要的操作:\n");
printf("1:输出\n");
printf("2:插入\n");
printf("3:删除\n");
printf("4:查询\n");
int op;
while (scanf("%d", &op) && op)
{
if (op == 1) {
printf("最新的链表为:");
PrintList(L);
}
else if (op == 2) {
printf("请输入需要插入的元素:");
ElemType e;
scanf("%d", &e);
printf("请输入需要插入的位置:");
int i;
scanf("%d", &i);
if (insertList(L, e, i))
printf("插入成功!\n");
else
printf("插入失败!\n");
}
else if (op == 3) {
printf("请输入需要删除的位置:");
int i;
scanf("%d", &i);
if (deleteList(L, i))
printf("删除成功!\n");
else
printf("删除失败!\n");
}
else if (op == 4) {
printf("请输入需要查找的元素:");
int e;
scanf("%d", &e);
if (locationList(L, e))
printf("所查询的元素是第%d个\n", locationList(L, e));
else
printf("未找到该元素!\n");
}
}
}
改成双向循环链表只需要将判断条件p == NULL 改为p == L;