数据结构——链表的实现
ex2_1——基本题
1)首先创建一个单链表:从键盘读入五个整数,按输入顺序形成单链表。将创建好的链表元素依次输出到屏幕上。
2)在已创建好的链表中插入一个元素:从键盘读入元素值和插入位置,调用插入函数完成插入操作。然后将链表元素依次输出到屏幕上。
3)在已创建好的链表中删除一个元素:从键盘读入欲删除的元素位置(序号),调用删除函数完成删除操作。然后将链表元素依次输出到屏幕上。
ex2_2——扩展题
1)创建一个单链表,其数据元素为整数,从键盘输入,输入0结束(注意0不放到链表内);
2)从键盘任意输入一个整数,在单链表中查询该数,如果单链表中已经存在这个数,就调用删除函数,删除该元素所在结点,并将单链表在删除前后的数据元素依次输出到屏幕上;
如果单链表中不存在这个数,就调用插入函数,将这个数插入到单链表尾,并将单链表在插入前后的数据元素依次输出到屏幕上。
3)教材第一章习题第9题(用链表实现)
ex2_3——扩展题
1)删除单链表中全部的负数
2)创建一个双向链表,按照冒泡排序的思路对这个双向链表进行排序,打印排序结果。注意,本算法在交换元素时是将链点整个交换而不是将链点中的元素值交换。
#include<stdio.h>
#include<malloc.h>
typedef struct LNODE{
int data;
struct LNODE* next;
}LNODE,*listlink;
typedef struct DLNODE{
int data;
struct DLNODE* next;
struct DLNODE* pre;
}DLNODE,*dlistlink;
void dlist_creat(dlistlink &l){
dlistlink p,q;
int e=1;
l=(dlistlink)malloc(sizeof(DLNODE));
l->pre=NULL;
l->next=NULL;
p=l;
q=l;
while(e!=0){
scanf("%d",&e);
if(e!=0){
p=(dlistlink)malloc(sizeof(DLNODE));
p->next=NULL;
p->pre=q;
p->data=e;
q->next=p;
q=p;
}
}
}
int dlist_length(dlistlink l){//return the length of dlist
int n=0;
while(l->next!=NULL){
n++;
l=l->next;
}
return n;
}
void dlist_print(dlistlink l)//print the whole elem in dlist
{
dlistlink p;
p=l;
while(p->next!=NULL){
p=p->next;
printf("%d ",p->data);
}
printf("\n");
}
void gulugulu(dlistlink &l){
dlistlink p,a,b,c,d,q;
int i,j=0;
int len=dlist_length(l);
for(i=0;i<len-1;i++){
p=l->next;
while(p->next!=NULL){
if(p->next->data>p->data){
if(p->next->next==NULL) {
q=p->next;
a=p->pre;
b=p->next->next;
a->next=q;
q->pre=a;
q->next=p;
p->pre=q;
p->next=b;
break;
}
q=p->next;
a=p->pre;
b=p->next->next;
a->next=q;
q->pre=a;
q->next=p;
p->pre=q;
p->next=b;
b->pre=p;
}
else
p=p->next;
}
}
}
void list_init(listlink &l)//init a new list
{
l=(struct LNODE*)malloc(sizeof(LNODE));
l->next=NULL;
}
void list_insertlast(listlink &l,int e){
listlink p=l,q;
while(p->next!=NULL){
p=p->next;
}
q=(listlink)malloc(sizeof(LNODE));
q->data=e;
q->next=NULL;
p->next=q;
}
void print(listlink l)//print the whole elem in list
{
listlink p;
p=l;
while(p->next!=NULL)
{
p=p->next;
printf("%d ",p->data);
}
printf("\n");
}
void ldelete(listlink &l,int a)// delete the elem in position"a"
{
listlink p=l,q;
int flag=0; int i=1;
flag=0;
while(p->next!=NULL){
if(i==a) {
q=p->next;
p->next=p->next->next;
free(q);
flag=1;
break;
}
p=p->next;
i++;
}
if(flag==0)
printf("fail");
}
int length(listlink l)//return the length of list
{
int n=0;
while(l->next!=NULL)
{
n++;
l=l->next;
}
return n;
}
void insert(listlink &l,int a,int e)//insert a new elem"e" in position "a" of the list
{
listlink p;
listlink newnode;
p=l;
int i=1;
int flag=0;
do{
if(length(p)==0){
newnode=(listlink)malloc(sizeof(LNODE));
newnode->next=NULL;
newnode->data=e;
p->next=newnode;
flag=1;
break;
}
if(i==a){
newnode=(listlink)malloc(sizeof(LNODE));
newnode->next=p->next;
newnode->data=e;
p->next=newnode;
flag=1;
break;
}
p=p->next;
i++;
}while(p->next!=NULL);
if(flag==0)
printf("fail");
}
int find(listlink l,int e)//find elem "e" in which position
{
listlink p=l,q;
int flag=0;
int i=1;
flag=0;
while(p->next!=NULL){
if(p->next->data==e){
flag=1;
break;
}
p=p->next;
i++;
}
if(flag==0){
printf("fail");
return 0;
}
else
return i;
}
void list_finddelete(listlink &l,int e){
listlink p=l;
int flag=0,i=0;
while(p->next!=NULL){
if(p->data==e) {
flag=1;
break;
}
p=p->next;
}
if(flag==0){
list_insertlast(l,e);
}
if(flag==1){
i=find(l,e);
ldelete(l,i);
}
}
void copy(listlink &p,listlink &l){
listlink m,n;
m=p->next;
n=l->next;
while(m!=NULL) {
n->data=m->data;
m=m->next;
n=n->next;
}
}
void revers(listlink &l){
listlink p,q,s; q=l;
s=NULL;
while(q->next!=NULL){
p=(listlink)malloc(sizeof(LNODE));
p->next=s;
s=p;
q=q->next;
p->data=q->data;
}
p=(listlink)malloc(sizeof(LNODE));
p->next=s;
copy(p,l);
}
void list_deletenegative(listlink &l)
{
int n=0;
listlink p=l->next,q;
while(p!=NULL) {
n++;
q=p->next;
if(p->data<0) {
ldelete(l,n);
n--;
}
p=q;
}
}
void main(){
listlink l;
int m=0;
int n,a,e=1;
printf("创建一个单链表,end='0'\n");//创建一个单链表
list_init(l);
while(e!=0){
scanf("%d",&e);
if(e!=0){
list_insertlast(l,e);
}
}
print(l);
printf("请输入插入的元素位置以及元素值空格分开\n");
scanf("%d %d",&a,&e);
insert(l,a,e);
print(l);
printf("请输入需要删除的元素位置\n");
scanf("%d",&n);
ldelete(l,n);
print(l);
printf("输入一个表内没有的数字,会插入到表尾\n");
scanf("%d",&e);
list_finddelete(l,e);
print(l);
printf("输入一个表内有的数字,会删掉他\n");
scanf("%d",&e);
list_finddelete(l,e);
print(l);
printf("以下的代码会删除表内的负数\n");
list_deletenegative(l);
print(l);
printf("以下代码为使用双链表完成的冒泡排序\n");
//revers(l);
//print(l);
dlistlink l2;
dlist_creat(l2);
dlist_print(l2);
printf("输出降序\n");
gulugulu(l2);
dlist_print(l2);
}