您的位置:首页 > 其它

双向链表的创建查找与删除元素

2016-05-14 23:46 288 查看
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

#include <stdio.h>
#include <stdlib.h>
#define ERROR printf("ERROR");
#define MAXSIZE 20
#define YES "yes"

typedef struct student {
char name[MAXSIZE];
struct student *Prior,*Next;
}Node,*LinkList;

struct student *CreatList(int n){
int i;
LinkList p1,p2,head;

head = (LinkList)malloc(sizeof(Node));
head->name[0] = '0';
head->Prior = NULL;
head->Next = NULL;
p2 = head;
printf("Please input the intenger array:\n");

for(i=0;i<n;i++){
p1 = (LinkList)malloc(sizeof(Node));

scanf("%s",p1->name);

p2->Next = p1;

p1->Prior = p2;
p1->Next = NULL;
p2 = p1;
}

p1->Next = NULL;
return head;
}

//查找元素
Node *search(LinkList h,char* E)
{
LinkList p;
p = h->Next;

while(p){
if(!(strcmp(p->name,E)))
return p;
else
p = p->Next;
}ERROR
return 0;
}

void ElementDelete(LinkList pt)
{
/*方法1:
LinkList qt;
qt = pt->Prior;
pt = qt->Next;
qt->Next = pt->Next;
free(pt);*/

//方法2:
pt->Next->Prior = pt->Prior;
pt->Prior->Next = pt->Next;
free(pt);
}

int main(int argc, char *argv[]) {

int n,name;
char FindName[MAXSIZE],st[3];
LinkList p,q,head;

printf("Please input the chain length:\n");
scanf("%d",&n);
head = CreatList(n);
p = head->Next;
printf("Now the chain is:\n");
while(p){
printf("%s\t",p->name);
p = p->Next;
}
printf("\n");

printf("Please enter the name you want to find:\n");
scanf("%s",FindName);
q = search(head,FindName);
if(q){
printf("已找到:%s\nAre you sure to delete it?('yes'or'no'):\n",q->name);
}

scanf("%s",st);
if(!(strcmp(YES,st))){
ElementDelete(q);
p = head->Next;
printf("Now the chain is:\n");
while(p){
printf("%s\t",p->name);
p = p->Next;
}
}
else
printf("Exited");

getch();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息